POST请求嵌套JSON
PHP卷曲蟒蛇要求POST请求嵌套JSON
试图让POST请求的API订购产品。看来,我无法弄清楚如何实际发送一个json-payload和post-request,以便API正确接收它。
该服务只提供了一个PHP的例子:
PHP-例如:
$params = array();
$params['access_token'] = '123abc';
$params['product_total'] = 2;
$params['product_list'] = array(
array(
'product_id' => 111
),
array(
'product_id' => 222
),
);
这是到目前为止我Python代码:
import requests
payload = {
"access_token": "123abc",
"product_total": 2,
"product_list":[
{
"product_id": 111,
...
},
{
"product_id": 222,
...
}]
}
r = requests.post(url, data=payload, verify=False)
r.text
> u'{"code":123,"msg":"product_id is empty"}'
所以什么是错的我发送方式product_list
。
我也试过:
import json
r = requests.post(url, data=json.dumps(payload), verify=False)
> u'{"code":456,"msg":"access_token is empty"}'
r = requests.post(url, json=json.dumps(payload), verify=False)
> u'{"code":456,"msg":"access_token is empty"}'
但比它无法读取access_token
了。
我使用的是python 2.7.9
和requests 2.18.4
。
更新: 也没有......
r = requests.post(url, json=payloal, verify=False)
> u'{"code":456,"msg":"access_token is empty"}'
更新2:
我在php-例如,我从API文档有更深层次的看,我发现这一点:
curl_setopt($this->__ch, CURLOPT_URL, $apiUrl);
curl_setopt($this->__ch, CURLOPT_HEADER, 0);
curl_setopt($this->__ch, CURLOPT_USERAGENT, $_SERVER ['HTTP_USER_AGENT']);
curl_setopt($this->__ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->__ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->__ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($this->__ch, CURLOPT_POST, 1);
curl_setopt($this->__ch, CURLOPT_POSTFIELDS, http_build_query($this->__params));
也许有人可以发现一些东西在这一行,我是失踪。
更新3:
我可以运行PHP的,例如没有问题,并创造一个秩序的方式。但仍然不能用python来完成。
我找到了解决办法:
payload = {
"access_token": "123abc",
"product_total": 2,
"product_list[0][product_id]": 111,
"product_list[1][product_id]": 222,
}
r = requests.post(url, data=payload, verify=False)
我如何解决它:
我重新设计通过打开一个本地端口并发送工作的php请求到这个端口以查看它的有效载荷,来编辑python函数应该具有的最终发布请求。
(mac terminal)
user$ nc -l localhost 11111 # to open port
POST/HTTP/1.1
Host: localhost:11111
Accept: */*
Content-Length: 115
Content-Type: application/x-www-form-urlencoded
access_token=123abc&product_total=2&product_list%5B0%5D%5Bproduct_id%5D=111&product_list%5B1%5D%5Bproduct_id%5D=22
只要有解码有效负载:
from urllib import parse
parse.unquote("access_token=123abc&product_total=2&product_list%5B0%5D%5Bproduct_id%5D=111&product_list%5B1%5D%5Bproduct_id%5D=22")
'access_token=123abc&product_total=2&product_list[0][product_id]=111&product_list[1][product_id]=22'
现在净荷的结构清晰可见,只需要复制它的蟒蛇POST请求。
这是有效负载如何找我最初的蟒蛇POST请求:
'access_token=123abc&product_total=2&product_list=product_id&product_list=product_id'
你可以清楚地看到,为什么它没有工作...
如果有人有一个解释为什么使用json-payload的post请求不起作用 - 我仍然对此非常感兴趣。目前为止我只能提出一个想法,即API不支持json-payload?
从以前类似问题的经验,你应该尝试(当然,实际上,http://stardict.sourceforge.net/Dictionaries.php下载你的Python列表)张贴在product_list
到同一JSON的字符串表示之前,您JSON转换:
import requests
import json
payload = {
"access_token": "123abc",
"product_total": 2,
"product_list": json.dumps([
{
"product_id": 111,
...
},
{
"product_id": 222,
...
}])
}
r = requests.post(url, data=payload, verify=False)
r.text
仍然是相同的响应:'> u'{“code”:123,“msg”:“product_id is empty”}'' – RandomDude
你有一个HTTP跟踪一个工作要求,看看有什么预期?或者API的文档? – Guillaume
我是唯一一个在banggood API链接上超时的人? – Guillaume
您是否尝试过使用'json'参数而不是'data'?像'requests.post(url,json = payload,verify = False)' – masterfloda
@masterfloda,试过你的建议 - 仍然失败 – RandomDude
把product_id值放在列表中怎么办?来自请求网站: payload = {'key1':'value1','key2':['value2','value3']} – SuperStew