我們要知道post請求四種傳送正文方式首先需要先了解一下常見的四種編碼方式:
HTTP 協(xié)議規(guī)定 POST 提交的數(shù)據(jù)必須放在消息主體(entity-body)中秸妥,但協(xié)議并沒有規(guī)定數(shù)據(jù)必須使用什么編碼方式呈昔。常見的四種編碼方式如下:
?1、application/x-www-form-urlencoded
這應該是最常見的 POST 提交數(shù)據(jù)的方式了挂绰。瀏覽器的原生 form 表單,如果不設置 enctype 屬性服赎,那么最終就會以 application/x-www-form-urlencoded 方式提交數(shù)據(jù)葵蒂。請求類似于下面這樣(無關的請求頭在本文中都省略掉了):
POST http://www.example.com HTTP/1.1 Content-Type:
application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
?2、multipart/form-data
除了傳統(tǒng)的application/x-www-form-urlencoded表單重虑,我們另一個經常用到的是上傳文件用的表單践付,這種表單的類型為multipart/form-data。
這又是一個常見的 POST 數(shù)據(jù)提交的方式嚎尤。我們使用表單上傳文件時荔仁,必須讓 form 的 enctyped 等于這個值,下面是示例
接下來我們就來說一下post請求四種傳送正文方式:
'''
遇到問題沒人解答芽死?小編創(chuàng)建了一個Python學習交流QQ群:857662006
尋找有志同道合的小伙伴乏梁,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
?3关贵、application/json
application/json 這個 Content-Type 作為響應頭大家肯定不陌生遇骑。實際上,現(xiàn)在越來越多的人把它作為請求頭揖曾,用來告訴服務端消息主體是序列化后的 JSON 字符串落萎。由于 JSON 規(guī)范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify炭剪,服務端語言也都有處理 JSON 的函數(shù)练链,使用 JSON 不會遇上什么麻煩。
?4奴拦、text/xml
它是一種使用 HTTP 作為傳輸協(xié)議媒鼓,XML 作為編碼方式的遠程調用規(guī)范。
post請求四種傳送正文方式:
(1)請求正文是application/x-www-form-urlencoded
(2)請求正文是multipart/form-data
(3)請求正文是raw
(4)請求正文是binary
(1)請求正文是application/x-www-form-urlencoded
形式:
1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'application/x-www-form-urlencoded'})
?Reqeusts支持以form表單形式發(fā)送post請求错妖,只需要將請求的參數(shù)構造成一個字典绿鸣,然后傳給requests.post()的data參數(shù)即可。
輸入:
'''
遇到問題沒人解答暂氯?小編創(chuàng)建了一個Python學習交流QQ群:857662006
尋找有志同道合的小伙伴潮模,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
url = 'http://httpbin.org/post'
d = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=d)
print r.text
輸出:
[
{
“args”: {},
“data”: “”,
“files”: {},
“form”: {
“key1”: “value1”,
“key2”: “value2”
},
“headers”: {
……
“Content-Type”: “application/x-www-form-urlencoded”,
……
},
“json”: null,
……
}
?可以看到痴施,請求頭中的Content-Type字段已設置為application/x-www-form-urlencoded擎厢,且d = {'key1': 'value1', 'key2': 'value2'}以form表單的形式提交到服務端究流,服務端返回的form字段即是提交的數(shù)據(jù)。
(2)請求正文是multipart/form-data
除了傳統(tǒng)的application/x-www-form-urlencoded表單动遭,我們另一個經常用到的是上傳文件用的表單梯嗽,這種表單的類型為multipart/form-data。
形式:
1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})
?發(fā)送文件中的數(shù)據(jù)需要(安裝requests_toolbelt)
from requests_toolbelt import MultipartEncoder
import requests
m = MultipartEncoder(
fields={'field0': 'value', 'field1': 'value',
'field2': ('filename', open('file.py', 'rb'), 'text/plain')}
)
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
?不需要文件
from requests_toolbelt import MultipartEncoder
import requests
m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})
(3)請求正文是raw
形式:
?傳入xml格式文本
1 requests.post(url='',data='<?xml ?>',headers={'Content-Type':'text/xml'})
?傳入json格式文本
1 requests.post(url='',data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})
或者:
1 requests.post(url='',json={{'key1':'value1','key2':'value2'}},headers={'Content-Type':'application/json'})
?可以將一json串傳給requests.post()的data參數(shù)沽损,
輸入:
'''
遇到問題沒人解答灯节?小編創(chuàng)建了一個Python學習交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書绵估!
url = 'http://httpbin.org/post'
s = json.dumps({'key1': 'value1', 'key2': 'value2'})
r = requests.post(url, data=s)
print r.text
輸出:
{
“args”: {},
“data”: “{\”key2\”: \”value2\”, \”key1\”: \”value1\”}”,
“files”: {},
“form”: {},
“headers”: {
……
“Content-Type”: “application/json”,
……
},
“json”: {
“key1”: “value1”,
“key2”: “value2”
},
……
}
(4)請求正文是binary
形式:
1 requests.post(url='',files={'file':open('test.xls','rb')},headers={'Content-Type':'binary'})
?Requests也支持以multipart形式發(fā)送post請求炎疆,只需將一文件傳給requests.post()的files參數(shù)即可。
輸入:
url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print r.text
輸出:
{
“args”: {},
“data”: “”,
“files”: {
“file”: “Hello world!”
},
“form”: {},
“headers”: {……
“Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a”,
……
},
“json”: null,
……
}
?文本文件report.txt的內容只有一行:Hello world!国裳,從請求的響應結果可以看到數(shù)據(jù)已上傳到服務端中形入。
注意:一定要注意headers的類型。