2013-04-01 237 views
3

我正在開發一個API包裝器。我試圖建立該規範中有如下要求:Python請求模塊:urlencoding json數據

curl -H "Content-type:application/json" -X POST -d data='{"name":"Partner13", "email":"[email protected]"}' http://localhost:5000/ 

這個請求產生從一個小的測試服務器我安裝了以下回應看exatly什麼頭/ PARAMS等作爲發送。這個小腳本生成:

uri: http://localhost:5000/, 
method: POST, 
api_key: None, 
content_type: application/json, 
params: None, 
data: data={"name":"Partner13", "email":"[email protected]"} 

所以這上面的是我希望我的Python腳本來創建,當它擊中的小測試腳本的結果。

我正在使用python requests模塊,這是我使用過的最美麗的HTTP lib。所以這裏是我的Python代碼:

uri = "http://localhost:5000/" 
headers = {'content-type': 'application/json' } 
params = {} 
data = {"name":"Partner13", "email":"[email protected]"} 
params["data"] = json.dumps(data) 
r = requests.post(uri, data=params, headers=headers) 

這麼簡單的東西。設置標題,併爲POST參數創建一個字典。該字典有一個名爲「data」的條目,它是我想發送給服務器的數據的JSON字符串。然後我打電話給這個帖子。但是,結果我的小測試腳本還給是:

uri: http://localhost:5000/, 
method: POST, 
api_key: None, 
content_type: application/json, 
params: None, 
data: data=%7B%22name%22%3A+%22Partner13%22%2C+%22email%22%3A+%22example%40example.com%22%7D 

所以基本上我想要的數據參數下的發送JSON數據已經urlendcoded。

有誰知道如何解決這個問題?我查看了請求文檔,似乎無法找到一種不自動urlencode發送數據的方法。

非常感謝, 凱文

+0

curl示例中的數據無效json。它是表單編碼和json的混合體。 –

回答

3

當創建用於數據的關鍵字的對象,簡單地分配一個可變json.dumps(數據)的結果。另外,因爲HTTP POST可以同時接受url參數和請求主體中的數據,並且因爲requests.post函數有一個名爲「params」的關鍵字參數,所以最好使用不同的變量名稱爲可讀性。請求文檔使用變量名「有效載荷」,這就是我使用的。

data = {"name":"Partner13", "email":"[email protected]"} 
payload = json.dumps(data) 
r = requests.post(uri, data=payload, headers=headers) 
0

請求自動URL編碼作爲數據傳遞的字典here。 John_GG的解決方案可以工作,因爲不是在'data'字段中發佈包含JSON編碼字符串的字典,而是直接傳遞JSON編碼字符串:字符串不會自動編碼。我不能說我理解Requests中這種行爲的原因,但不管它是什麼。沒有辦法切換我能找到的這種行爲。

祝你好運,凱文。

+0

你所指的「這裏」是對url參數進行編碼,因爲它們進入了url,當然這些參數是url編碼的。在request post函數簽名中,「params」是指url參數,而「data」是指POST主體。 –

+0

@John_GG實際上,它也用於對請求主體進行編碼。調用堆棧就像'Request.init()' - >'PreparedRequest.prepare()' - >'PreparedRequest.prepare_body()' - >'RequestEncodingMixin._encode_params()'。這似乎是自動處理具有「application/x-www-form-urlencoded」內容的請求。 – augurar