首頁 > 軟體

requests.post()方法中data和json引數的使用

2022-02-14 13:01:11

requests.post()中data和json引數

json和dict

python中的dict型別要轉換為json格式的資料需要用到json庫:

import json 
<json> = json.dumps(<dict>)
<dict> = json.loads(<json>)

需要注意的是python中並沒有json型別這一說法,通過json.dumps(<dict>)轉換的字典物件,最後得到的是一個字串物件,也就是說,在python中json格式的資料實際上就是一個字串

>>> j = json.dumps(<dict>)
>>> type(j)
<class 'str'>

雖說json格式的資料在python中是以字串的型別存在的,但是通過str(<dict>)工廠函數所得到的結果同json.dumps(<dict>)方法所得到的結果是不相同的

>>> d = {'a': 1, 'b': 2}
>>> d_d = {"a": 1, "b": 2}
>>> string = str(d)
>>> string_d = str(d_d)
>>> js = json.dumps(d)
>>> js_d = json.dumps(d_d)
>>> string == string_d
True
>>> js = js_d
True
>>> string == js
False
>>> string
"{'a': 1, 'b': 2}"
>>> js
'{"a": 1, "b": 2}'

可以看出來string和js的區別在於引號。對於可以作為json.loads(<str>)引數物件的字串,除了要滿足字典型別的格式外,所有的字串物件必須是雙引號。

requests.post()

在通過requests.post()進行POST請求時,傳入報文的引數有兩個,一個是data,一個是json。

常見的form表單可以直接使用data引數進行報文提交,而data的物件則是python中的字典型別;

而在最新爬蟲的過程中遇到了一種payload報文,是一種json格式的報文,因此傳入的報文物件也應該是格式的;這裡有兩種方法進行報文提交:

import requests
import json 
url = "http://example.com"
data = {
    'a': 1,
    'b': 2,
}
# 1
requests.post(url, data=json.dumps(data))
# 2-json引數會自動將字典型別的物件轉換為json格式
requests.post(url, json=data)

其它

在requests.get()方法中可以使用params引數來構建url

有時候請求得到的結果可能呈現亂碼的狀態,可以通過resp.encoding屬性檢視網頁編碼方式,同時可以在獲取resp.text之前對resp.encoding='utf-8'賦值,這樣再次獲取的resp.text則會使用我們要求的編碼方式。

post請求中json和data的區別

post請求中,可以使用data傳遞引數,也可以使用json傳遞引數

那麼這兩種方式有什麼區別呢?

如果引數為JSON資料,可以直接傳入json引數,它將自動編碼並將Content-Type的置為application/json

payload = {'key1': 'value1', 'key2': 'value2'} 
r = requests.post("https://httpbin.org/post", json=payload)
print(r.text)

如果data傳遞的引數為字串,例如【json.dumps(payload)】,則request對引數進行url編碼,Content-Type的值為None,所以data傳字串時,一定要在header中指定Content-Type

payload = {'key1': 'value1', 'key2': 'value2'}
headers={"Content-Type": "application/json"}
r = requests.post("https://httpbin.org/post", headers=headers,data=json.dumps(payload))
print(r.text)

如果data傳遞的是字典、元組組成的列表或列表作為值的字典,則request對引數進行url編碼,Content-Type的值為application/x-www-form-urlencoded

# 字典
payload1 = {'key1': 'value1', 'key2': 'value2'}  
r = requests.post("https://httpbin.org/post", data=payload1)
# 元組組成的列表
payload2 = [('key1', 'value1'), ('key1', 'value2')]  
r = requests.post("https://httpbin.org/post", data=payload2)
# 列表作為值的字典
payload3 = {'key1': ['value1', 'value2']}  
r = requests.post("https://httpbin.org/post", data=payload3)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com