Python3+requests:post請求四種傳送正文方式(詳解)

我們要知道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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜡吧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子占键,更是在濱河造成了極大的恐慌昔善,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔乙,死亡現(xiàn)場離奇詭異君仆,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門返咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钥庇,“玉大人,你說我怎么就攤上這事咖摹∑酪蹋” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵萤晴,是天一觀的道長吐句。 經(jīng)常有香客問我,道長店读,這世上最難降的妖魔是什么嗦枢? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮两入,結(jié)果婚禮上净宵,老公的妹妹穿的比我還像新娘。我一直安慰自己裹纳,他們只是感情好择葡,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剃氧,像睡著了一般敏储。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朋鞍,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天已添,我揣著相機與錄音,去河邊找鬼滥酥。 笑死更舞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的坎吻。 我是一名探鬼主播缆蝉,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘦真!你這毒婦竟也來了刊头?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤诸尽,失蹤者是張志新(化名)和其女友劉穎原杂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您机,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡穿肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年年局,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被碗。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡某宪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锐朴,到底是詐尸還是另有隱情兴喂,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布焚志,位于F島的核電站衣迷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酱酬。R本人自食惡果不足惜壶谒,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膳沽。 院中可真熱鬧汗菜,春花似錦、人聲如沸挑社。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痛阻。三九已至菌瘪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阱当,已是汗流浹背俏扩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弊添,地道東北人录淡。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像油坝,于是被迫代替她去往敵國和親嫉戚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容