urllib和requests調(diào)用post時的注意事項(xiàng):Content-Type

Content-Type常見的有x-www-form-urlencoded;charset=UTF-8和application/json兩種,格式不對的話可能出錯?。?/p>

x-www-form-urlencoded;charset=UTF-8

這種類型最為常見,在使用urllib庫發(fā)送post請求時,往往這么操作:

from urllib import parse,request

#其實(shí)默認(rèn)就是這種格式,這一句也可以不加
headers = {'Content-Type': 'x-www-form-urlencoded;charset=UTF-8'}
#構(gòu)造需要post的數(shù)據(jù)
data={"name":"小明","password":"123456"}
#編碼成urlencode格式
data = bytes(parse.urlencode(data),encoding='utf8')
#構(gòu)造request
req =request.Request(url=url, headers=headers,data=data,method="POST")
#發(fā)起請求
response =request.urlopen(req)

在執(zhí)行完data = bytes(parse.urlencode(data).encode(‘utf-8’)后,data由原來的dict對象轉(zhuǎn)成了bytes對象,而且內(nèi)容變成了b'name=%E5%B0%8F%E6%98%8E&password=123456'有沒有很熟悉?我們地址欄常見這種東西,其實(shí)它就是將原來dict對象中的鍵值對,轉(zhuǎn)化成了類似get方法的鏈接形式,并將其中的數(shù)據(jù)進(jìn)行編碼。也即post過去的就是這個bytes對象

對于requests:

import requests

#其實(shí)默認(rèn)就是這種格式,這一句也可以不加
headers = {'Content-Type': 'x-www-form-urlencoded;charset=UTF-8'}
#需要post的數(shù)據(jù)
data={"name":"小明","password":"123456"}
#不需要編碼,直接發(fā)請求
response=requests.post(url,headers=headers,data=data)

application/json

這種相對不常見,但應(yīng)該是今后的主流,因?yàn)楫吘筳son才是未來嘛。

在使用urllib庫發(fā)送post請求時,需要這么操作:

from urllib import parse,request
import json

#修改格式
headers = {'Content-Type': 'application/json'}
#構(gòu)造需要post的數(shù)據(jù)
data={"name":"小明","password":"123456"}
#編碼成json格式
data = bytes(json.dumps(data),encoding='utf8')
#構(gòu)造request
req =request.Request(url=url, headers=headers,data=data,method="POST")
#發(fā)起請求
response =request.urlopen(req)

同樣,在執(zhí)行完data = bytes(json.dumps(data),encoding='utf8')后,data由原來的dict對象轉(zhuǎn)成了bytes對象,但內(nèi)容和上面得不同,變成了b'{"name": "\\u5c0f\\u660e", "password": "123456"}',一眼就能看出,這就是json格式呀,只是中間的中文被編碼了

對于requests:

import requests

#修改格式
headers = {'Content-Type': 'application/json'}
#構(gòu)造需要post的數(shù)據(jù)
data={"name":"小明","password":"123456"}
#轉(zhuǎn)成json格式
response=requests.post(url,headers=headers,data=json.dumps(data))

案例:

在調(diào)用6panAPI搭建自動提交離線任務(wù)的項(xiàng)目時,API要求的請求數(shù)據(jù)是json格式的,但我沒有去修改請求頭和數(shù)據(jù),造成post請求過去之后,服務(wù)器以為我發(fā)了一個空請求,于是還給我一個{“success”:0},給我整蒙了,最后進(jìn)了官方QQ群問了技術(shù)支持人員才知道

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容