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ù)支持人員才知道