[英]What is the difference between those two requests?
為了實現任務自動化,我需要編寫一些python代碼,該代碼向Web服務發出發布請求,然后檢索信息等。
首先,我嘗試使用請求。
import requests
def make_invoice_body(terminal, service, code, number):
return {
"terminalId": terminal,
"serviceId" : service,
"invoiceNumber": number,
"invoiceCode": code,
"paymentType": 1,
"requestNumber": random.randint(1000000, 9999999)
}
headers = {'Content-Type': 'application/json'}
body = make_invoice_body(51, "1001000", "FOO", "123456")
requests.post(url, headers=headers, data=body)
以上代碼段收到錯誤作為響應。
然后我嘗試使用urllib2
,
import urllib2
import json
req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
resp = urllib2.urlopen(req, body) #body from above
print resp.read()
而且有效。
現在,我對以上片段的差異感到好奇。 他們不應該執行相同的任務並獲得相同的答案嗎?
從請求版本2.4.2起,您可以在請求中使用json參數作為
requests.post(url, headers=headers, json=body)
如果使用json參數,您還可以刪除“ application / json”標頭,因為json參數使其多余。
如果要使用數據,則需要先使用以下命令將字典轉換為json
data = json.dumps(body)
HTTP世界中沒有“本機字典”格式。
真正的區別是requests
太聰明了。
在requests
使用data=
時,您嘗試發布multipart/form-data
。 在這種情況下, dict
將以form-data
格式解壓縮為鍵/值對。
在requests
使用json=
時, requests
將自動json.dumps
將您的dict
json.dumps
為原始字節字符串,並為您設置Content-Type
。
但是在urllib
,它只提供您所提供的功能。 您需要手動json.dumps
您的dict
。 因此,我相信您所舉的例子是錯誤的。 它應該如下所示:
import urllib2
import json
req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
resp = urllib2.urlopen(req, json.dumps(body)) #body from above
print resp.read()
感謝@tmadam的提醒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.