POST 請(qǐng)求用于向服務(wù)器發(fā)送數(shù)據(jù)。與 get 相比更安全,同時(shí) post 請(qǐng)求一般會(huì)帶來(lái)數(shù)據(jù)的更改。
GET 請(qǐng)求不論我們?cè)趺礃?gòu)造,最終都是通過(guò) URL 向服務(wù)器傳遞數(shù)據(jù),而 post 通過(guò)消息體(報(bào)文主體)發(fā)送請(qǐng)求。
在發(fā)送 post 請(qǐng)求的時(shí)候,我們需要關(guān)注一下 HTTP 請(qǐng)求的頭部信息,特別是Content-Type
,這是用來(lái)告訴服務(wù)器請(qǐng)求中包含的數(shù)據(jù)類型。這會(huì)影響服務(wù)器如何提取數(shù)據(jù)。
常見(jiàn)的Content-Type
如下:
application/x-www-form-urlencoded
這是最常見(jiàn)的數(shù)據(jù)類型,通常表明請(qǐng)求的數(shù)據(jù)類型是鍵值對(duì)類型,也就是頁(yè)面 form 表單數(shù)據(jù),如:application/json
這意味著請(qǐng)求的數(shù)據(jù)類型是 Json 格式的數(shù)據(jù):multipart/form-data
multipart/form-data 通常用于上傳文件。application/xml
這表明數(shù)據(jù)格式為 xml 格式。
前兩種是較為常見(jiàn)的數(shù)據(jù)類型,一般默認(rèn)情況下都是使用application/x-www-form-urlencoded
, 在 requests 的 post 請(qǐng)求中以此為默認(rèn)的數(shù)據(jù)類型。
由于之前提供的免費(fèi) API 中 post 請(qǐng)求基本上都沒(méi)法使用,我們還是采用之前在 postman 中使用過(guò)的 showdoc 小項(xiàng)目中的登錄為例,來(lái)演示如何發(fā)送 post 請(qǐng)求。
首先,我們先登錄后抓包:
image
通過(guò)抓包可以獲取到我們需要的數(shù)據(jù):
請(qǐng)求 url
content-type:application/x-www-form-urlencoded
請(qǐng)求報(bào)文數(shù)據(jù):username=showdoc&password=123456&v_code=
由于 requests 默認(rèn)以 content-type:application/x-www-form-urlencoded 發(fā)送 post 請(qǐng)求,所以這里我們不需要特殊處理。
同樣,我們可以通過(guò)響應(yīng)對(duì)象 r 查看請(qǐng)求和響應(yīng)中的其他內(nèi)容:
查看實(shí)際的請(qǐng)求數(shù)據(jù):
查看響應(yīng)中的 cookie:
這里的 cookie 是服務(wù)端返回的,會(huì)用在后續(xù)的請(qǐng)求中,如果需要獲取:
發(fā)送 json 格式的數(shù)據(jù)
requests 默認(rèn)使用 form 表單的形式發(fā)送數(shù)據(jù),那如果服務(wù)器要求使用 json 格式呢?
有兩種方法可以處理:
修改請(qǐng)求頭部,傳入自定義的 content-type
通過(guò)參數(shù) json 傳遞數(shù)據(jù)
修改請(qǐng)求頭部:
直接使用 json 參數(shù)
使用 json 參數(shù)傳遞,除了會(huì)增加 content-type 為 application/json
外,還會(huì)將 data 字典自動(dòng)編碼為 json 格式。
而如果我們自定義 content-type 的方式還需要自己將數(shù)據(jù)構(gòu)造成 json 格式的數(shù)據(jù)
所以 ,明顯直接使用第二種方式更方便,所以強(qiáng)烈推薦直接用第二種方式。
當(dāng)然如果涉及到非 form 和 json 格式的數(shù)據(jù),就必須要用第一種方式自己構(gòu)造 content-type 了。