我們要知道post請求四種傳送正文方式首先需要先了解一下常見的四種編碼方式:
HTTP 協(xié)議規(guī)定 POST 提交的數(shù)據(jù)必須放在消息主體(entity-body)中吐葱,但協(xié)議并沒有規(guī)定數(shù)據(jù)必須使用什么編碼方式粘我。常見的四種編碼方式如下:
?1恨搓、application/x-www-form-urlencoded
這應(yīng)該是最常見的 POST 提交數(shù)據(jù)的方式了枷恕。瀏覽器的原生 form 表單,如果不設(shè)置 enctype 屬性寻咒,那么最終就會以 application/x-www-form-urlencoded 方式提交數(shù)據(jù)评甜。請求類似于下面這樣(無關(guān)的請求頭在本文中都省略掉了):
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表單仔涩,我們另一個經(jīng)常用到的是上傳文件用的表單忍坷,這種表單的類型為multipart/form-data。
這又是一個常見的 POST 數(shù)據(jù)提交的方式。我們使用表單上傳文件時佩研,必須讓 form 的 enctyped 等于這個值柑肴,下面是示例
接下來我們就來說一下post請求四種傳送正文方式:
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 作為響應(yīng)頭大家肯定不陌生旬薯。實際上晰骑,現(xiàn)在越來越多的人把它作為請求頭,用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串绊序。由于 JSON 規(guī)范的流行硕舆,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務(wù)端語言也都有處理 JSON 的函數(shù)骤公,使用 JSON 不會遇上什么麻煩抚官。
?4、text/xml
它是一種使用 HTTP 作為傳輸協(xié)議阶捆,XML 作為編碼方式的遠程調(diào)用規(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ù)構(gòu)造成一個字典洒试,然后傳給requests.post()的data參數(shù)即可倍奢。
輸入:
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字段已設(shè)置為application/x-www-form-urlencoded垒棋,且d = {'key1': 'value1', 'key2': 'value2'}以form表單的形式提交到服務(wù)端卒煞,服務(wù)端返回的form字段即是提交的數(shù)據(jù)。
(2)請求正文是multipart/form-data
除了傳統(tǒng)的application/x-www-form-urlencoded表單叼架,我們另一個經(jīng)常用到的是上傳文件用的表單畔裕,這種表單的類型為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ù)碉碉,
輸入:
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的內(nèi)容只有一行:Hello world!垢粮,從請求的響應(yīng)結(jié)果可以看到數(shù)據(jù)已上傳到服務(wù)端中。
注意:一定要注意headers的類型靠粪。
本文轉(zhuǎn)載博文地址:https://www.cnblogs.com/insane-Mr-Li/p/9145152.html