1
chairuosen 2015-08-30 18:49:14 +08:00
echo 大法好
麻烦点的就是 ide+xdebug |
2
adrianzhang OP @chairuosen 还是不太明白,用 echo 怎么看?
|
3
falcon05 2015-08-30 18:59:34 +08:00 via iPhone
抓包,简单粗暴
|
4
seki 2015-08-30 19:00:04 +08:00 1
echo 就相当于一些语言的 print
想看哪个对象就 echo 哪个对象…… |
5
adrianzhang OP |
6
adrianzhang OP @seki 还是不出结果
我是把源文件里: curl_setopt ($ch, CURLOPT_URL, $authUrl ); 改成 $test = curl_setopt ($ch, CURLOPT_URL, $authUrl ); echo $test; 然后再执行 php test.php ,但是还是没有结果。应该改成什么呢? |
7
des 2015-08-30 19:31:31 +08:00 1
|
8
adrianzhang OP @des 好的,我试试。
|
9
shiny 2015-08-30 19:34:29 +08:00
本地开 fiddler 然后设置 curl 的代理为 fiddler 的
|
10
adrianzhang OP |
11
feiyuanqiu 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; 就能看到你要的东西了 |
12
ljbha007 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 参数文章里有说 |
13
ljbha007 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}是前面得到的请求头 |
14
ChoateYao 2015-08-30 20:21:59 +08:00 1
CURLOPT_VERBOSE 、 CURLOPT_STDERR
启用这两个参数即可。 |
15
adrianzhang 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 ) |
16
adrianzhang OP @ChoateYao 谢谢,又学了一招。
|
17
MaiCong 2015-08-30 20:31:20 +08:00
Xdebug + WebGrind
https://www.google.co.uk/?gws_rd=cr,ssl#q=Xdebug WebGrind |
18
adrianzhang 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 ) ``` |
19
ljbha007 2015-08-30 20:32:57 +08:00 1
|
20
adrianzhang OP 为什么不支持我的代码块??
|
21
mudone 2015-08-30 20:35:26 +08:00 1
curl_setopt ($ch, CURLOPT_VERBOSE, true );
|
22
adrianzhang OP @ljbha007
加 @是参考这里: https://docs.python.org/2/library/httplib.html 的 POST sample 。 经测试,去掉 @,还是 400 ;去掉 text/plain ,还是 400 ; 改成 application/json ,还是 400 。太邪门了。 |
23
ljbha007 2015-08-30 20:46:26 +08:00 1
你用 chrome 装个叫 postman 的工具测一下试试 不需要写代码
先把参数调对了再说 |
24
adrianzhang OP @ljbha007 好的,我试试。多谢。
|
25
ljbha007 2015-08-30 22:12:39 +08:00 1
|
26
adrianzhang 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 。 |
27
ljbha007 2015-08-30 22:38:27 +08:00 1
@adrianzhang 你先不写代码 手动把参数调对吧
|
28
adrianzhang OP @ljbha007
又解决一个: request_url 只能设置域名,不可设置路径,要在 request_token.request ("POST", "", params, headers ) 这句里面 POST 后那个地方加上路径。 但仍然不行。 最后!还是太谢谢你了!! 最后最后一个问题就是:要去掉那个"Accept": "text/plain" |