如何使用Python请求发送嵌套元组



我是一名PHP开发人员,正试图创建一个Python脚本来与我的应用程序对话。这是代码。我的错误在哪里?

#Python客户端代码

import json
import requests
POST_URL = 'https://corporate-url.com/index.php?service=api&format=json&task=sayhello'
payload_map    = {'key1': 'value1', 'key2': 'value2'}
payload_tuples = [
('key1', 'value1'),
('key2', 'value2')
]
payload_mixed  = {
'name': 'John',
'surname': 'Doe',
'Age': 30,
'log': payload_tuples
}
print(json.dumps(payload_mixed))    # renders {"Age": 30, "surname": "Doe", "name": "John", "log": [["key1", "value1"], ["key2", "value2"]]}
r = requests.post(POST_URL, data=payload_mixed)
print(r.url)
print(r.status_code)
print(r.json())

服务器上的PHP代码

$response = (isset($_POST['log']) ? $_POST['log'] : $_POST);
echo json_encode($response, JSON_THROW_ON_ERROR);
exit;

客户端Python控制台中的OUTPUT

# with object payload_map as object 'log' in object payload_mixed
https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
key1
# with object payload_tuples as object 'log' in object payload_mixed
https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
value2

为什么";log"-对象永远不会被正确渲染,而只是它的一个片段?

如果我执行这个命令

r = requests.post(POST_URL, data=payload_map)

则输出为

https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
{u'key2': u'value2', u'key1': u'value1'}

如果我执行这个命令

r = requests.post(POST_URL, data=payload_tuples)

则输出为

https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
{u'key2': u'value2', u'key1': u'value1'}

为什么我的嵌套对象没有这样渲染?我要求它像这样呈现:

https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
{u'Age': u'30', u'surname': u'Doe', u'name': u'John', u'log': {u'key2': u'value2', u'key1': u'value1'}}

编辑:建议使用json.dumps()包装有效载荷对象。我更改并看到以下输出:

https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
[]

将我的PHP脚本更改为调试$_REQUEST而不是$_POST,这表明没有收到POST数据:

$response = $_REQUEST;
echo json_encode($response, JSON_THROW_ON_ERROR);
exit;

输出:

https://corporate-url.com/index.php?service=api&format=json&task=sayhello
200
{u'task': u'sayhello', u'service': u'api', u'format': u'json'}

试试这个

import json
import requests
POST_URL = 'https://corporate-url.com/index.php?service=api&format=json&task=sayhello'
payload_map    = {'key1': 'value1', 'key2': 'value2'}
payload_tuples = [
('key1', 'value1'),
('key2', 'value2')
]
payload_mixed  = {
'name': 'John',
'surname': 'Doe',
'Age': 30,
'log': payload_tuples
}
r = requests.post(POST_URL, data=json.dumps(payload_mixed)) #add json.dumps()
print(r.url)
print(r.status_code)
print(r.json())

最新更新