requests 發送 post請求的三種方式


在http 協議中,post 提交的數據需放在消息主體的,但協議並沒有規定必須使用什么編碼方式,從而導致了提交方式的不同。服務端根據請求同一種的 Content-Type 字段來獲取請求中消息主體是用何種方式進行編碼,再對消息主體進行解析。

 具體的編碼方式有: 

- application/x-www-form-urlencoded  # 以form表單形式提交數據,最常見也是大家最熟悉的 
- application/json  # 以json串提交數據。 
- multipart/form-data  # 上傳文件


下面使用requests來發送上述三種編碼的POST 請求

1、提交Form 表單 "Content-Type": "application/x-www-form-urlencoded"
  requests提交Form表單,一般存在於網站的登錄,用來提交用戶名和密碼。以 http://httpbin.org/post 為例,在requests中,以form表單形式發送post請求,只需要將請求的參數構造成一個字典,然后傳給requests.post()的data參數即可。

代碼如下:
url = "http://httpbin.org/post"
d = {"key1":"value1","key2":"value2"}
r = requests.post(url, data=d) # requests.post() 中利用 data 屬性
print(r.text)

  輸出效果如下:

 
         

{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-60c06a74-78d1256647615a962d76bf9b"
},
"json": null,
"origin": "219.133.170.253",
"url": "http://httpbin.org/post"
}

 

httpbin.org 網站可以顯示你提交請求的內容,輸出的”Content-Type”:”application/x-www-form-urlencoded”,證明這是提交Form的方式。

 


2、提交json串 "Content-Type": "application/json"

對於提交json串,主要是用於發送ajax請求中,動態加載數據。

   下面把請求頭和請求實體列舉一下:

錯誤寫法:

 
         
import requests

url = "http://lazytools.feidee.cn/v1/qrcode/log"
data = {
"category": 0,
"content": "。。。。。hahha'a",
"source": 1
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat",
"Accept-Encoding": "gzip, deflate",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": "lazytools.feidee.cn"

}
r = requests.post(url=url,data =data,headers=headers)
print(r.text)
 

打印內容如下:

{"code":-1,"data":null,"message":"請求參數解析失敗"}

即使寫上了 'Content-Type':'application/json; charset=UTF-8' ,返回依然出錯了,原因就在於 你的請求實體的格式錯了,服務端無法解碼

 

正確寫法1:

正確代碼是把data進行json編碼,再發送。代碼如下:

r = requests.post(url=url,data=json.dumps(data),headers=headers)  # 利用 json 對 字典序列化

這個時候再看一下打印內容,已經成功了

正確寫法2:

處理將data主動編碼為json發送之外,requests還提供了一個json參數,自動使用json方式發送,而且在請求頭中也不用顯示聲明 'Content-Type':'application/json; charset=UTF-8'。
完整代碼如下

 
         
import requests

url = "http://lazytools.feidee.cn/v1/qrcode/log"
data = {
"category": 0,
"content": "。。。。。hahha'a",
"source": 1
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat",
"Accept-Encoding": "gzip, deflate",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "keep-alive",
"Host": "lazytools.feidee.cn"

}
r = requests.post(url=url,json =data,headers=headers) # 直接把字典傳給 requests.post() 的 json 參數
print(r.text)

 



3、上傳文件 "Content-Type": "application/x-www-form-urlencoded"
上傳文件在爬蟲中使用的很少,不過還是使用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)  # 文件傳給 requests.post() 的 files 參數
print(r.text)

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM