一个 PHP file ,向一个 web api 提出 POST 请求。我不懂 PHP ,想看看这个 POST 请求的整个 URL 是什么样的,怎么才能办到呢?
这个 PHP file 现在我的电脑上,取名 test.php ,可以用 php test.php 运行。
这个 PHP file 现在我的电脑上,取名 test.php ,可以用 php test.php 运行。
1
chairuosen Aug 30, 2015
echo 大法好
麻烦点的就是 ide+xdebug |
2
adrianzhang OP @chairuosen 还是不太明白,用 echo 怎么看?
|
3
GG668v26Fd55CP5W Aug 30, 2015 via iPhone
抓包,简单粗暴
|
4
seki Aug 30, 2015 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 Aug 30, 2015 |
8
adrianzhang OP @des 好的,我试试。
|
9
shiny PRO 本地开 fiddler 然后设置 curl 的代理为 fiddler 的
|
10
adrianzhang OP |
11
feiyuanqiu Aug 30, 2015 //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 Aug 30, 2015 代码里有啊
http://api.microsofttranslator.com/v2/Http.svc/Detect?text= text 是参数 请求头里有 basic auth OAuth 的地址是 https://datamarket.accesscontrol.windows.net/v2/OAuth2-13 参数文章里有说 |
13
ljbha007 Aug 30, 2015
先访问 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 Aug 30, 2015 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 Aug 30, 2015
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 Aug 30, 2015 |
20
adrianzhang OP 为什么不支持我的代码块??
|
21
mudone Aug 30, 2015 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 Aug 30, 2015 你用 chrome 装个叫 postman 的工具测一下试试 不需要写代码
先把参数调对了再说 |
24
adrianzhang OP @ljbha007 好的,我试试。多谢。
|
25
ljbha007 Aug 30, 2015 |
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 Aug 30, 2015 @adrianzhang 你先不写代码 手动把参数调对吧
|
28
adrianzhang OP @ljbha007
又解决一个: request_url 只能设置域名,不可设置路径,要在 request_token.request ("POST", "", params, headers ) 这句里面 POST 后那个地方加上路径。 但仍然不行。 最后!还是太谢谢你了!! 最后最后一个问题就是:要去掉那个"Accept": "text/plain" |