Хотя исходная команда curl
не была включена, хотя было указано, что данные были отправлены через POST
на сервер как есть. Я собираюсь предположить, что curl -d '{"name":"du1"}'
использовался вместе с соответствующими отправляемыми заголовками. Теперь, чтобы продемонстрировать это, используется следующая команда:
$ curl http://httpbin.org/post -d '{"name":"du1"}' -H 'Content-Type: application/json'
{
"args": {},
<b>"data": "{\"name\": \"du1\"}", </b>
"files": {},
<i>"form": {}, </i>
"headers": {
"Accept": "*/*",
"Content-Length": "15",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.61.0"
},
<b>"json": {
"name": "du1"
}, </b>
"url": "http://httpbin.org/post"
}
Обратите внимание на выделенный жирным ключом данных - это то, что, вероятно, читалось вашим приложением. Напротив, делая то же самое, что и с предоставленным использованием requests
в той же конечной точке:
>>> import requests
>>> r = requests.post('http://httpbin.org/post', data={"name":"du1"})
>>> print(r.text)
{
"args": {},
<b>"data": "",</b>
"files": {},
<i>"form": {
"name": "du1"
}, </i>
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "8",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.21.0"
},
<b>"json": null, </b>
"url": "http://httpbin.org/post"
}
Обратите внимание, как запросы были декодированы в форму просто потому, что a) представленные данные были необработанный словарь, а не строка с кодировкой JSON и б) заголовок не был предоставлен. Чтобы исправить это, просто закодируйте данные и предоставьте соответствующие заголовки:
>>> import requests
>>> import json
>>> data = json.dumps({"name":"du1"})
>>> r = requests.post(
... 'http://httpbin.org/post', data=data,
... headers={'Content-Type': 'application/json'})
>>> print(r.text)
{
"args": {},
"data": "{\"name\": \"du1\"}",
"files": {},
"form": {},
...
"json": {
"name": "du1"
},
...
}
Обратите внимание, что сервер теперь может интерпретировать предоставленные данные и может декодировать их как JSON.