簡體   English   中英

這兩個請求有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM