2017-08-14 60 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請求。