2017-08-14 62 views
0

我想发送一个简单的POST请求到服务器使用请求。我正在做(至少我认为)快速启动()正在做的事情。 POST请求似乎忽略了data =标记,并且不会将数据附加到url的末尾。这是我有:请求POST数据不会被追加到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

“POST”中的'data'是在body中传递的,而不是在URL中。 'params'是在URL中对其进行编码的正确参数。你确定这是一个“POST”表单吗? – AChampion

+0

看看这是否更有意义:http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests – AChampion

回答

0

试图转储​​到json和使用dict

payload = {} 

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

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

'data'作为消息的主体不在网址。 'requests'自动将'dict'转换为'json'。 – AChampion

+0

这里的网址是'url ='http:// localhost:5000/todo/api/v1.0/tasks'。我没有在'url'中创建'键值对'。我错过了什么吗? – PYA

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请求。