Python:POST中使用请求的错误请求

时间:2014-12-17 10:39:39

标签: python http

我应该发送这个:

curl --header "Content-Type: text/plain" --request POST --data "ON" example.com/rest/items/z12

相反,我发送的是:

import requests
headers = {"Content-Type": "text/plain"}
url = 'http://example.com/rest/items/z12'
_dict = {"ON": ""}
res = requests.post(url, auth=('demo', 'demo'), params=_dict, headers=headers)

我收到错误400(错误请求?)

我做错了什么?

2 个答案:

答案 0 :(得分:3)

POST正文设置为ON;使用data参数:

import requests

headers = {"Content-Type": "text/plain"}
url = 'http://example.com/rest/items/z12'

res = requests.post(url, auth=('demo', 'demo'), data="ON", headers=headers)

params参数用于URL查询参数,并使用字典,您要求requests将其编码为表单编码;因此?ON=已添加到网址中。

请参阅curl manpage

  

(HTTP)将POST请求中的指定数据发送到HTTP服务器,就像用户填写HTML表单并按下提交按钮时浏览器所做的那样。

requests API

  

data - (可选)要在Request正文中发送的字典,字节或类文件对象。

答案 1 :(得分:2)

params方法中的

requests.post参数用于将GET参数添加到URL。所以你正在做这样的事情:

curl --header "Content-Type: text/plain" --request POST example.com/rest/items/z12?ON=

您应该使用data参数。

import requests
headers = {"Content-Type": "text/plain"}
url = 'http://example.com/rest/items/z12'
res = requests.post(url, auth=('demo', 'demo'), data="ON", headers=headers)

此外,如果您给数据参数提供一个字典,它会将有效负载发送为“application / x-www-form-urlencoded”。在curl命令中,您将原始字符串作为有效负载发送。这就是我改变你的榜样的原因。