前言
一個http請求包括三個部分,為別為請求行,請求報頭,消息主體,類似以下這樣:
- 請求行
- 請求報頭
- 消息主體
HTTP協議規定post提交的數據必須放在消息主體中,但是協議並沒有規定必須使用什么編碼方式。
服務端通過是根據請求頭中的Content-Type字段來獲知請求中的消息主體是用何種方式進行編碼,再對消息主體進行解析。
具體的編碼方式包括:
application/x-www-form-urlencoded
最常見post提交數據的方式,以form表單形式提交數據。
application/json
以json串提交數據。
multipart/form-data
一般使用來上傳文件。
三種編碼請求實例
1.提交Form表單
Reqeusts支持以form表單形式發送post請求,只需要將請求的參數構造成一個字典,然后傳給requests.post()的data參數即可。
2.提交json串
錯誤寫法:json格式data參數不能傳送字典,不然運行會報錯
headers可以用fiddler去抓取
即使寫上了 'Content-Type':'application/json; charset=UTF-8' ,返回依然出錯了,原因就在於 你的請求實體的格式錯了,服務端無法解碼。
正確寫法
1.import json用json.dumps將字典轉換成json格式
r = requests.post(url=url,data=json.dumps(data),headers=headers)
2傳參數時直接使用json,這個方法headers里面不用再傳"Content-Type":"application/json; charset=UTF-8"
r = requests.post(url=url,json=jdata,headers=headers)
3.上傳文件
上傳文件在爬蟲中使用的很少,不過還是使用requests講解一下使用方式。
Content-Type類型為multipart/form-data,以multipart形式發送post請求,只需將一文件傳給requests.post()的files參數即可。還是以http://httpbin.org/post 為例,
代碼如下:
url = 'http://httpbin.org/post' files = {'file': open('upload.txt', 'rb')} r = requests.post(url, files=files) print(r.text)