[python]如何在requests post時不做urlencode?

    這兩天要爲公司一個項目的服務端寫性能測試腳本,其中有一個請求訂單號的接口,需要客戶端用post請求向服務端發送加密過的token 和訂單數據。代碼如下:

payload = {'token':token,'order_data':order_data}

r = requests.post(url, data=payload}

但是,服務端返回錯誤,花了很長時間檢查了token和order_data的加密算法,確認沒錯;

查了下文檔,上面有這樣一句話:

There are many times that you want to send data that is not form-encoded. If you pass in a string instead of a dict, that data will be posted directly.

所以,只要直接傳一個string作爲payload數據,requests就不會做任何轉換,直接發出去。
這樣,代碼就改爲:
payload = "token="+token+"&order_data="+order_data
r = requests.post(url, data=payload}

但是,奇怪的是,服務端還是報錯。

後來只好換用curl來發
cmd = 'curl -d \"token=' +token+'&json_data='+str_json+'\" '+url
os.system(cmd)
這樣是成功的

那用requests到底錯在什麼地方呢?

用wireshark抓包發現:
用reqeusts和curl發送的數據都是一樣的,但是,curl有帶一個header:"Content-Type": "application/x-www-form-urlencoded"
看來requests也需要加上這個頭:

headers = {"Content-Type": "application/x-www-form-urlencoded"}
r = requests.post(url, data=payload, headers=headers)

這樣就OK了
發佈了72 篇原創文章 · 獲贊 7 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章