请求POST数据未附加到网址

时间:2017-08-14 17:57:06

标签: python post python-requests

我正在尝试使用请求向服务器发送简单的POST请求。我正在做(至少我想)快速启动(http://docs.python-requests.org/en/master/user/quickstart/)正在做什么。 POST请求似乎忽略了data =标记,并且没有将数据附加到url的末尾。这就是我所拥有的:

import requests, json

url = 'http://localhost:5000/todo/api/v1.0/tasks'
payload = (('key1', 'value1'), ('key1', 'value2'))

r=requests.post(url, data=payload)
print 'url is: ', r.url

,输出为:

url is: http://localhost:5000/todo/api/v1.0/tasks

我不知道它是否相关,但是如果我使用GET标签params =,则网址会按照我的预期进行组合:

r=requests.post(url, params=payload)

url is: http://localhost:5000/todo/api/v1.0/tasks/?key1=value&key1=value2

有人看错了吗?提前致谢

2 个答案:

答案 0 :(得分:0)

尝试将payload转储到json并使用dict

payload = {}

payload[key1] = value1
payload[key2] = value2

payload_data = json.dumps(payload)
r=requests.post(url, data=payload_data)

答案 1 :(得分:0)

POST数据在请求正文中传递,而不是URL。 POST HTTP请求看起来像这样

POST /login HTTP/1.1
Host: example.com
Content-Length: <length>

firstname=john&lastname=doe

因为你可以看到URL没有传递这些参数,这很重要,因为我在这个答案中没有提到很多原因。但是,如果由于某种原因你确实需要在URL而不是请求的主体中传递这些参数,那么这就是你可能会这样做的。

import requests, urllib

url = 'http://localhost:5000/todo/api/v1.0/tasks'
payload = (('key1', 'value1'), ('key1', 'value2'))

request_data = urllib.urlencode(payload) # Turns it into key1=value1&key1=value2

response = requests.post(url + "?" + request_data)

这将以您在答案底部的GET请求中看到的相同方式制作请求,而是作为POST请求。