Python requests POST 400错误

8

我看到很多类似于我的问题,但是找不到解决方案。

我正在使用 requests 执行 POST 请求。我尝试了很多请求的组合,但没有一个返回 201 ok。

这是我的代码:

 import json
 import requests

 if __name__ == '__main__':

    headers = {'content-type' : 'application/json'}
    url = "http://myserver/ext/v3.1/test_device"
    message = {"atribute_a": "value", "atribute_b": "valueb"}
    params = {"priority":"normal"}

    r = requests.post(url, params=params, headers=headers, data = json.dumps(message) )
    print(r)

我也尝试过不使用json.dumps,但仍然返回400错误请求。我还尝试直接将参数添加到URL中,例如:...?priority=normal,但没有成功。


在requests.post中,params和headers之间不应该有逗号吗? - Gaurav Ojha
是的,@GauravOjha。我测试了一下用逗号。只是一个不好的复制和粘贴。 - lmbcerqueira
你尝试过直接使用data = message而不是json.dumps吗? - Gaurav Ojha
是的,@GauravOjha。我在我的代码后面说了这句话,但还是谢谢你想要帮助我。 - lmbcerqueira
这可能与您的服务器如何处理此请求有关。您能否展示一下您的服务器期望接收什么样的请求? - Gaurav Ojha
例如,如果我运行以下命令:curl -vvv -X POST -H 'Content-Type: application/json' -d '{"atribute_a": "value", "atribute_b": false}' "http://myserver/ext/v3.1/test_device/?priority=normal",则在命令行中会得到201 ok的响应。@GauravOjha - lmbcerqueira
2个回答

18

最简单的技巧是使用json而不是data,如下所示:

requests.post(url, headers=headers, params=params, json=data)

8

根据评论,您的服务器实际上期望将数据作为字符串化的JSON对象传输。

就参数而言,如果将其声明为元组的元组(或字典的字典),可能会有所帮助。

请尝试以下操作 -

headers = {
    'content-type': 'application/json',
}

params = (
    ('priority', 'normal'),
)

data = {
    "atribute_a": "value",
    "atribute_b": false
}

requests.post(url, headers=headers, params=params, data=str(data))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接