『居善地』接口測(cè)試 — 8.Requests庫(kù)POST請(qǐng)求(一)

POST請(qǐng)求用于向服務(wù)器提交數(shù)據(jù)席覆,比如增刪改數(shù)據(jù)直砂,提交一個(gè)表單新建一個(gè)用戶(hù)菌仁、或修改一個(gè)用戶(hù)等。

對(duì)于POST請(qǐng)求哆键,我們可以通過(guò)瀏覽器開(kāi)發(fā)者工具或者其他外部工具來(lái)進(jìn)行抓包掘托,得到請(qǐng)求的URL、請(qǐng)求頭(request headers)以及請(qǐng)求的表單data信息籍嘹,這三樣恰恰是我們用Requests模擬POST請(qǐng)求時(shí)需要的闪盔。

關(guān)于請(qǐng)求頭的配置和GET請(qǐng)求是一樣的弯院,都是定義headers屬性即可。

而關(guān)于POST請(qǐng)求提交的參數(shù)泪掀,是和GET請(qǐng)求是不一樣的听绳。

post請(qǐng)求四種傳送正文方式:

  • (1)請(qǐng)求正文是application/x-www-form-urlencoded

  • (2)請(qǐng)求正文是multipart/form-data

  • (3)請(qǐng)求正文是raw

  • (4)請(qǐng)求正文是binary

這四種提交數(shù)據(jù)的方式,是在請(qǐng)求頭Content-Type屬性中來(lái)定義异赫。

1椅挣、application/x-www-form-urlencoded

Reqeusts支持以application/x-www-form-urlencoded數(shù)據(jù)格式發(fā)送POST請(qǐng)求(標(biāo)準(zhǔn)的POST請(qǐng)求數(shù)據(jù)格式,默認(rèn))塔拳,只需要將請(qǐng)求的參數(shù)構(gòu)造成一個(gè)字典鼠证,然后傳給requests.post()的data參數(shù)即可。

示例:

"""
1.學(xué)習(xí)目標(biāo)
    必須掌握requests庫(kù)發(fā)送post請(qǐng)求方法
2.HTTP協(xié)議中post請(qǐng)求參數(shù)類(lèi)型
    requests.post(url, data=None, json=None, **kwargs)
    根據(jù)不同的請(qǐng)求參數(shù)類(lèi)型分為如下幾種:
        x-www-form-data-urlencoded
        raw_json格式
        form-data
        binary
3.json格式
    # 1.導(dǎo)入requests庫(kù)
    # 2.明確請(qǐng)求地址
    # 3.明確請(qǐng)求參數(shù)
        data = {key:value}  字典格式
    # 4.發(fā)送請(qǐng)求
        requests.post(url=url,json=data)
4.需求
    通過(guò)訪(fǎng)問(wèn)http://httpbin.org/post接口靠抑,驗(yàn)證post參數(shù)類(lèi)型

"""
# 1.導(dǎo)入requests庫(kù)
import requests
import json

# 2.明確請(qǐng)求地址
url = "http://httpbin.org/post"
# 3.明確請(qǐng)求參數(shù)
data = {
    "dep_id": "T01",
    "dep_name": "Test學(xué)院",
    "master_name": "Test-Master",
    "slogan": "Here is Slogan"
}
# 4.發(fā)送請(qǐng)求
response = requests.post(url=url, data=data)

# 將python對(duì)象轉(zhuǎn)換為json字符串(格式化返回?cái)?shù)據(jù))
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串類(lèi)型
print(result)

"""
返回結(jié)果:
{
  "args": {},
  "data": "",
  "files": {},
  ****************主要看這里
  "form": {
    "dep_id": "T01",
    "dep_name": "Test學(xué)院",
    "master_name": "Test-Master",
    "slogan": "Here is Slogan"
  },
  ***********************
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "88",
    *****************主要看這里
    "Content-Type": "application/x-www-form-urlencoded",
    *****************
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.18.4",
    "X-Amzn-Trace-Id": "Root=1-5ff401e3-1553596b7788e77e275c4772"
  },
  "json": null,
  "origin": "106.35.9.12",
  "url": "http://httpbin.org/post"
}
"""

說(shuō)明:

  • 發(fā)送的請(qǐng)求中量九,form屬性接收了參數(shù)。
  • 在請(qǐng)求頭中颂碧,Content-Type屬性為application/x-www-form-urlencoded
  • 使用application/x-www-form-urlencoded格式發(fā)送數(shù)據(jù)荠列,requests.post(url=url, data=data)方法中一定要使用data變量來(lái)接收參數(shù)。
  • 換句話(huà)說(shuō)數(shù)據(jù)格式是字典格式载城,使用data變量來(lái)接收肌似,會(huì)默認(rèn)發(fā)送application/x-www-form-urlencoded數(shù)據(jù)格式的POST請(qǐng)求。(也可以在請(qǐng)求頭中明確一下Content-Type屬性诉瓦,但沒(méi)必要川队。)

2、請(qǐng)求正文是raw

RAW的原意就是“未經(jīng)加工”垦搬。換句話(huà)說(shuō)RAW方式使用的是純字符串的數(shù)據(jù)上傳方式呼寸,所以在發(fā)送POST請(qǐng)求之前,可能需要手工的把一些JSON格式的數(shù)據(jù)轉(zhuǎn)換成字符串的(加兩單引號(hào))猴贰,在進(jìn)行提交。

RAW數(shù)據(jù)格式的POST請(qǐng)求有兩種:

  • 一種是xml格式文本(text/xml)
  • 一種是json格式文本(application/json)

下面我們一一說(shuō)明:

(1)json格式文本(application/json)

# 1.導(dǎo)入requests庫(kù)
import requests
import json

# 2.明確請(qǐng)求地址
url = "http://httpbin.org/post"
# 3.明確請(qǐng)求參數(shù)
data = {
    "data": [
        {
            "dep_id": "T01",
            "dep_name": "Test學(xué)院",
            "master_name": "Test-Master",
            "slogan": "Here is Slogan"
        }
    ]
}

# headers = {"Content-Type": "application/json"}

# 4.發(fā)送請(qǐng)求
response = requests.post(url=url, json=data)
print(response)  # <Response [200]>
print(response.text)


"""
返回結(jié)果:
{
  "args": {}, 
  "data": "{\"data\": [{\"dep_id\": \"T01\", \"dep_name\": \"Test\\u5b66\\u9662\", \"master_name\": \"Test-Master\", \"slogan\": \"Here is Slogan\"}]}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "119", 
    **************************主要看這里
    "Content-Type": "application/json", 
    **************************
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4", 
    "X-Amzn-Trace-Id": "Root=1-5ff40a9d-6a6f19d272ba4c1b40ff7bbb"
  }, 
    **************************主要看這里
  "json": {
    "data": [
      {
        "dep_id": "T01", 
        "dep_name": "Test\u5b66\u9662", 
        "master_name": "Test-Master", 
        "slogan": "Here is Slogan"
      }
    ]
  }, 
    **************************
  "origin": "106.35.9.12", 
  "url": "http://httpbin.org/post"
}
"""

說(shuō)明:

  • 發(fā)送的請(qǐng)求中河狐,json屬性接收了參數(shù)米绕。
  • 在請(qǐng)求頭中,Content-Type屬性為application/json馋艺。
  • 使用application/json格式發(fā)送數(shù)據(jù)栅干,requests.post(url=url, json=data)方法中一定要使用json變量來(lái)接收參數(shù)。
  • 換句話(huà)說(shuō)數(shù)據(jù)格式是Json格式捐祠,使用json變量來(lái)接收碱鳞,Requests會(huì)默認(rèn)發(fā)送application/json數(shù)據(jù)格式的POST請(qǐng)求。(也可以在請(qǐng)求頭中明確一下Content-Type屬性踱蛀,但沒(méi)必要窿给。)

注意:

這里我們可以發(fā)現(xiàn)Requests模擬post請(qǐng)求時(shí)贵白,請(qǐng)求頭格式為application/x-www-form-urlencoded與application/json的主要差別在于請(qǐng)求主體的構(gòu)造格式(前者是鍵值對(duì),后者是JSON串),前者直接用字典傳入崩泡,后者用json.dumps()函數(shù)將字典轉(zhuǎn)為JSON串即可禁荒。

也就是說(shuō)在有需要的時(shí)候json模塊下的dumps函數(shù)可以將dict轉(zhuǎn)換為str。

(2)xml格式文本(text/xml)

# 1.導(dǎo)入requests庫(kù)
import requests
import json

# 2.明確請(qǐng)求地址
url = "http://httpbin.org/post"
# 3.明確請(qǐng)求參數(shù)
data = '<sites>' \
            '<site>' \
                '<name>菜鳥(niǎo)教程</name>' \
                '<url>www.runoob.com</url>' \
            '</site>' \
            '<site>' \
                '<name>Google</name>' \
                '<url>www.google.com</url>' \
            '</site>' \
       '</sites>'

#  requests.post方法中適用json變量來(lái)接收數(shù)據(jù)角撞,
# 默認(rèn)是"Content-Type": "application/json", 
# 這里我們需要重新聲明一下Content-Type屬性呛伴。
headers = {'Content-type': 'text/xml'}

# 4.發(fā)送請(qǐng)求
# 如果數(shù)據(jù)用data變量來(lái)接收會(huì)報(bào)錯(cuò)。
response = requests.post(url=url, json=data, headers=headers)
print(response)  # <Response [200]>
# print(response.text)

# 將python對(duì)象轉(zhuǎn)換為json字符串(格式化返回?cái)?shù)據(jù))
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串類(lèi)型
print(result)

"""
返回結(jié)果:
{
  "args": {},
  "data": "\"<sites><site><name>\\u83dc\\u9e1f\\u6559\\u7a0b</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>\"",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "149",
    **************************主要看這里
    "Content-Type": "text/xml",
    **************************
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.18.4",
    "X-Amzn-Trace-Id": "Root=1-5ff40fa5-21a79b532b1ccf6d20173fd7"
  },
  **************************主要看這里
  "json": "<sites><site><name>菜鳥(niǎo)教程</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>",
    **************************
  "origin": "106.35.9.12",
  "url": "http://httpbin.org/post"
}
"""

說(shuō)明:

  • text/xml格式相對(duì)用的少谒所。
  • xml也可以作為一個(gè)文件來(lái)傳輸热康。
  • 需要重新聲明請(qǐng)求頭中Content-Type屬性。
  • 其他和application/json一樣劣领。

提示:其實(shí)raw格式數(shù)據(jù)可以上傳text姐军、json、xml剖踊、html等純字符的文本庶弃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市德澈,隨后出現(xiàn)的幾起案子歇攻,更是在濱河造成了極大的恐慌,老刑警劉巖梆造,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缴守,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡镇辉,警方通過(guò)查閱死者的電腦和手機(jī)屡穗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忽肛,“玉大人村砂,你說(shuō)我怎么就攤上這事∫俟洌” “怎么了础废?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罕模。 經(jīng)常有香客問(wèn)我评腺,道長(zhǎng),這世上最難降的妖魔是什么淑掌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任蒿讥,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芋绸。我一直安慰自己媒殉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布侥钳。 她就那樣靜靜地躺著适袜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舷夺。 梳的紋絲不亂的頭發(fā)上苦酱,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音给猾,去河邊找鬼疫萤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛敢伸,可吹牛的內(nèi)容都是我干的扯饶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼池颈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尾序!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起躯砰,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤每币,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后琢歇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體兰怠,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年李茫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭保。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魄宏,死狀恐怖秸侣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宠互,我是刑警寧澤塔次,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站名秀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏藕溅。R本人自食惡果不足惜匕得,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汁掠,春花似錦略吨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乞榨,卻和暖如春秽之,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吃既。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工考榨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹦倚。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓河质,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親震叙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掀鹅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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