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ù),如:username=nemo&password=123456
-
application/json
這意味著請(qǐng)求的數(shù)據(jù)類型是 Json 格式的數(shù)據(jù):{"username":"nemo", "password":"123456"}
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)求惩猫。
首先,我們先登錄后抓包:
通過(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=
import requests
url = 'http://127.0.0.1/showdoc/server/index.php?s=/api/user/login'
# 以字典的形式構(gòu)造數(shù)據(jù)
data = {
'username': 'showdoc',
'password': '123456'
}
# 與 get 請(qǐng)求一樣蚜点,r 為響應(yīng)對(duì)象
r = requests.post(url, data=data)
# 查看響應(yīng)結(jié)果
print(r.json())
由于 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ù):
print(r.request.body)
## username=showdoc&password=123456
查看響應(yīng)中的 cookie:
print(r.cookies)
## <RequestsCookieJar[<Cookie cookie_token=...1b4181689f for 127.0.0.1/>]>
這里的 cookie 是服務(wù)端返回的奶镶,會(huì)用在后續(xù)的請(qǐng)求中,如果需要獲扰憔小:
print(r.cookies.get('cookie_token'))
## 2e7afd2de4dfdab4187b3587f6d532654f854b14f91b4181689f0ddd2fdfa0b9
發(fā)送 json 格式的數(shù)據(jù)
requests 默認(rèn)使用 form 表單的形式發(fā)送數(shù)據(jù)厂镇,那如果服務(wù)器要求使用 json 格式呢?
有兩種方法可以處理:
- 修改請(qǐng)求頭部左刽,傳入自定義的 content-type
- 通過(guò)參數(shù) json 傳遞數(shù)據(jù)
修改請(qǐng)求頭部:
import requests
url = 'http://127.0.0.1/showdoc/server/index.php?s=/api/user/login'
# 注意這里必須以json字符串構(gòu)造數(shù)據(jù)
data = '''
{
"username": "showdoc",
"password": "123456"
}
'''
headers = {'content-type': 'application/json'}
# 與 get 請(qǐng)求一樣捺信,r 為響應(yīng)對(duì)象
r = requests.post(url, data=data, headers=headers)
# 查看響應(yīng)結(jié)果
print(r.json())
# 查看請(qǐng)求頭部
print(r.request.headers)
## 你可以看看 content-type 字段
直接使用 json 參數(shù)
import requests
url = 'http://127.0.0.1/showdoc/server/index.php?s=/api/user/login'
# 這里依然以字典的形式構(gòu)造數(shù)據(jù)
data = {
'username': 'showdoc',
'password': '123456'
}
# 與 get 請(qǐng)求一樣,r 為響應(yīng)對(duì)象
r = requests.post(url, json=data)
# 查看響應(yīng)結(jié)果
print(r.json())
# 查看請(qǐng)求頭部
print(r.request.headers)
## 你可以看看 content-type 字段
使用 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 了吠式。