|  |      1chairuosen      2015-08-30 18:49:14 +08:00 echo 大法好 麻烦点的就是 ide+xdebug | 
|  |      2adrianzhang OP @chairuosen 还是不太明白,用 echo 怎么看? | 
|  |      3GG668v26Fd55CP5W      2015-08-30 18:59:34 +08:00 via iPhone 抓包,简单粗暴 | 
|  |      4seki      2015-08-30 19:00:04 +08:00  1 echo 就相当于一些语言的 print 想看哪个对象就 echo 哪个对象…… | 
|  |      5adrianzhang OP | 
|  |      6adrianzhang OP @seki 还是不出结果 我是把源文件里: curl_setopt ($ch, CURLOPT_URL, $authUrl ); 改成 $test = curl_setopt ($ch, CURLOPT_URL, $authUrl ); echo $test; 然后再执行 php test.php ,但是还是没有结果。应该改成什么呢? | 
|  |      7des      2015-08-30 19:31:31 +08:00  1 | 
|  |      8adrianzhang OP @des 好的,我试试。 | 
|  |      9shiny      2015-08-30 19:34:29 +08:00 本地开 fiddler 然后设置 curl 的代理为 fiddler 的 | 
|  |      10adrianzhang OP | 
|      11feiyuanqiu      2015-08-30 19:52:28 +08:00  1 //Create an Http Query.// $paramArr = http_build_query ($paramArr ); //Set the Curl URL. curl_setopt ($ch, CURLOPT_URL, $authUrl ); //Set HTTP POST Request. curl_setopt ($ch, CURLOPT_POST, TRUE ); //Set data to POST in HTTP "POST" Operation. curl_setopt ($ch, CURLOPT_POSTFIELDS, $paramArr ); $authUrl 是请求 url 地址 $paramArr 是 post 过去的参数 你可以直接在 curl_setopt ($ch, CURLOPT_POSTFIELDS, $paramArr ); 这里 var_dump ($authUrl, $paramArr );exit; 就能看到你要的东西了 | 
|  |      12ljbha007      2015-08-30 19:59:57 +08:00  1 代码里有啊 http://api.microsofttranslator.com/v2/Http.svc/Detect?text= text 是参数 请求头里有 basic auth OAuth 的地址是 https://datamarket.accesscontrol.windows.net/v2/OAuth2-13 参数文章里有说 | 
|  |      13ljbha007      2015-08-30 20:04:42 +08:00 先访问 https://datamarket.accesscontrol.windows.net/v2/OAuth2-13  然后照这个格式 post grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com {0}是 client_id {1}是 client_secret 返回的是个 json access_token 字段就是 access_token http://api.microsofttranslator.com/v2/Http.svc/Detect?text= 然后请求翻译 api 的时候加个 Authorization: Bearer {access_token}的请求头就可以了 {access_token}是前面得到的请求头 | 
|      14ChoateYao      2015-08-30 20:21:59 +08:00  1 CURLOPT_VERBOSE 、 CURLOPT_STDERR 启用这两个参数即可。 | 
|  |      15adrianzhang OP @feiyuanqiu  多谢!明白了这个构造。 @ljbha007 很感激这么详细的说明。我是用 python 来构造这个的。所以就想知道 PHP 这个实现跟我的到底哪儿不一样。不知你是否也懂 python ,若懂,也请看看我这段代码到底怎么回事,总是拿不回 token 的 json 值。写成以下这样,总是得到 400 bad request 。 class Microsoft_translator_api (): """translate text only""" def __init__(self, text ): self.text = text self.request_url = "datamarket.accesscontrol.windows.net/v2/OAuth2-13" self.client_id = "我的应用名" self.client_secret = "我的密钥" self.grant_type = "client_credentials" self.scope = "http://api.microsofttranslator.com" def get_token (self ): params = urllib.urlencode ({'@grant_type': self.grant_type, '@scope': self.scope, '@client_id': self.client_id, '@client_secret': self.client_secret}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} request_token = httplib.HTTPConnection (self.request_url ) request_token.request ("POST", "", params, headers ) response = request_token.getresponse () print response.status, response.reason token = response.read () #print token request_token.close () return (token ) | 
|  |      16adrianzhang OP @ChoateYao 谢谢,又学了一招。 | 
|      17MaiCong      2015-08-30 20:31:20 +08:00 Xdebug + WebGrind https://www.google.co.uk/?gws_rd=cr,ssl#q=Xdebug WebGrind | 
|  |      18adrianzhang OP @ljbha007 忘记用 markdown 了。代码如下: ``` class Microsoft_translator_api (): """translate text only""" def __init__(self, text ): self.text = text self.request_url = "datamarket.accesscontrol.windows.net/v2/OAuth2-13" self.client_id = "我的应用名" self.client_secret = "我的密钥" self.grant_type = "client_credentials" self.scope = "http://api.microsofttranslator.com" def get_token (self ): params = urllib.urlencode ({'@grant_type': self.grant_type, '@scope': self.scope, '@client_id': self.client_id, '@client_secret': self.client_secret}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} request_token = httplib.HTTPConnection (self.request_url ) request_token.request ("POST", "", params, headers ) response = request_token.getresponse () print response.status, response.reason token = response.read () #print token request_token.close () return (token ) ``` | 
|  |      19ljbha007      2015-08-30 20:32:57 +08:00  1 | 
|  |      20adrianzhang OP 为什么不支持我的代码块?? | 
|  |      21mudone      2015-08-30 20:35:26 +08:00  1 curl_setopt ($ch, CURLOPT_VERBOSE, true ); | 
|  |      22adrianzhang OP @ljbha007  加 @是参考这里: https://docs.python.org/2/library/httplib.html 的 POST sample 。 经测试,去掉 @,还是 400 ;去掉 text/plain ,还是 400 ; 改成 application/json ,还是 400 。太邪门了。 | 
|  |      23ljbha007      2015-08-30 20:46:26 +08:00  1 你用 chrome 装个叫 postman 的工具测一下试试 不需要写代码 先把参数调对了再说 | 
|  |      24adrianzhang OP @ljbha007 好的,我试试。多谢。 | 
|  |      25ljbha007      2015-08-30 22:12:39 +08:00  1 | 
|  |      26adrianzhang OP @ljbha007  目前发现的问题有:使用元组替换字典。这样才有正确的顺序。 params = urllib.urlencode ((('grant_type', self.grant_type ), ('scope', self.scope ), ('client_id', self.client_id ), ('client_secret', self.client_secret ))) 请求是 https 而不是 http ,所以还要把 request_token = httplib.HTTPConnection (self.request_url )换成 request_token = httplib.HTTPSConnection (self.request_url ) 但现在这两个改了以后还是拿不到 json 格式的 token 。 | 
|  |      27ljbha007      2015-08-30 22:38:27 +08:00  1 @adrianzhang 你先不写代码 手动把参数调对吧 | 
|  |      28adrianzhang OP @ljbha007  又解决一个: request_url 只能设置域名,不可设置路径,要在 request_token.request ("POST", "", params, headers ) 这句里面 POST 后那个地方加上路径。 但仍然不行。 最后!还是太谢谢你了!! 最后最后一个问题就是:要去掉那个"Accept": "text/plain" |