Python實現(xiàn)接口測試中的常見四種Post請求數(shù)據(jù)

前情:

在日常的接口測試工作中辨宠,模擬接口請求通常有兩種方法悯辙,
利用工具來模擬琳省,比如fiddler,postman躲撰,poster针贬,soapUI等
利用代碼來模擬,使用到一些網(wǎng)絡模塊拢蛋,比如HttpClient桦他,或者requests等

Fiddler是一個簡單的http協(xié)議調(diào)試代理工具,它界面友好谆棱,易于操作快压,是調(diào)試網(wǎng)絡,抓取請求的利器之一垃瞧。

Requests包是趁著目前如火如荼的爬蟲風潮而流行起來的Python的第三方包蔫劣,使用簡單,對于不需要對網(wǎng)絡底層模塊有太多了解又想實現(xiàn)接口測試的測試人員來說簡直不要太友好个从。

在接口測試中脉幢,接口通常是GET請求或者POST請求。以下是對接口測試中常見的四種Post請求數(shù)據(jù)方式進行一個詳細的講解:

post請求主體詳解
一個正常的post請求主要包括請求行嗦锐,請求頭鸵隧,請求主體

對于get請求來說沒有請求主體entity-body。對于post請求而言意推,不會對發(fā)送請求的數(shù)據(jù)格式進行限制,理論上你可以發(fā)任意數(shù)據(jù)珊蟀,但是服務器能不能處理就是另一回事了菊值。服務器收到數(shù)據(jù)后外驱,如何解析數(shù)據(jù)呢?它會以請求頭中的Content-Type設置的內(nèi)容來進行數(shù)據(jù)解析腻窒。確定好Content-Type的格式之后昵宇,請求主體的數(shù)據(jù)格式也就確定下來了。

Content-Type的格式有四種:分別是application/x-www-form-urlencoded(這也是默認格式)儿子、application/json瓦哎、text/xml以及multipart/form-data格式

這些不同的post請求數(shù)據(jù)格式要通過HttpEntity來構(gòu)造柔逼,有必要簡單理一下HttpClient的HttpEntity對象蒋譬,因為所有的post請求數(shù)據(jù)均需要置于HttpEntity實體中進行發(fā)送。HttpEntity是一個接口愉适,實現(xiàn)這個接口的具體類有很多犯助,比較常用的是StringEntity、UrlEncodedFormEntity(繼承自StringEntity)维咸、MultipartEntity剂买。他們將在發(fā)送不同格式的post請求時被用到。接下來就詳細地介紹每一種數(shù)據(jù)格式對應的fiddler請求模擬和Requests請求模擬(Python實現(xiàn))的實現(xiàn)情況癌蓖。

(一)application/x-www-form-urlencoded數(shù)據(jù)格式
W3C官網(wǎng)上明確對這種數(shù)據(jù)格式進行了定義:

This is the default content type. Forms submitted with this content type must be encoded as follows:Control names and values are escaped. Space characters are replaced by '+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by '%HH', a percent sign and two hexadecimal digits representing the ASCII code of the character. Line breaks are represented as "CR LF" pairs (i.e., '%0D%0A').The control names/values are listed in the order they appear in the document. The name is separated from the value by '=' and name/value pairs are separated from each other by '&'.

這是post請求最常見也是默認的數(shù)據(jù)提交格式瞬哼。它要求數(shù)據(jù)名稱(name)和數(shù)據(jù)值(value)之間以等號相連,與另一組name/value值之間用&相連租副。例如:parameter1=12345&parameter2=23456坐慰。將請求的內(nèi)容進行格式化了,其實這個方法同時簡化的客戶端發(fā)送附井,也簡化了服務器端獲取讨越,服務器通過getParameters(String name)即可獲取到傳送來的信息。這是最常見post提交數(shù)據(jù)的方式永毅,以form表單形式提交數(shù)據(jù)把跨。

(1)如果用fiddler模擬請求的話,請求頭和請求主體的內(nèi)容可以這樣構(gòu)造:


模擬請求之后沼死,從返回結(jié)果可以查看到我們的請求數(shù)據(jù):


(2)如果用Requests模擬post請求的話着逐,請求可以這樣構(gòu)造:

datas = {'parameter1':'12345','parameter2':'23456'}
r = requests.post('http://example.com',data=datas)
print(r.content)
print(r.status_code)

Reqeusts支持以form表單形式發(fā)送post請求,只需要將請求的參數(shù)構(gòu)造成一個字典意蛀,然后傳給requests.post()的data參數(shù)即可耸别。

**(二)application/json數(shù)據(jù)格式 **

application/json格式的請求頭是指用來告訴服務端post過去的消息主體是序列化后的 JSON 字符串。

(1)如果用fiddler模擬請求的話县钥,請求頭和請求主體的內(nèi)容可以這樣構(gòu)造:


模擬請求之后秀姐,從返回結(jié)果可以看到我們的請求數(shù)據(jù):


(2)如果用Requests模擬post請求的話,請求可以這樣構(gòu)造:

url = 'http://www.example/post'
s = json.dumps({'key1': 'value1', 'key2': 'value2'})
r = requests.post(url, data=s)
print (r.text)

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

(三)text/xml數(shù)據(jù)格式

(1)如果用fiddler模擬請求的話蠢沿,請求頭和請求主體的內(nèi)容可以這樣構(gòu)造:

xmlrequest.png

模擬請求之后伸头,從返回結(jié)果可以看到我們的請求數(shù)據(jù):

xmlresponse.png

(2)如果用Requests模擬post請求的話,請求可以這樣構(gòu)造:

xml = """my xml"""
headers = {'Content-Type': 'application/xml'}
requests.post('http://www.example.com', data=xml, headers=headers)

或者把xml作為一個文件來傳輸:

import requests

def request_ws(request):
with open(archivo_request,"r") as archivo:
    request_data = archivo.read()

target_url = "http://127.0.0.1:8000/?wsdl"

headers = {'Content-type':'text/xml'}

data_response = requests.post(target_url, data=request_data, headers=headers)

(四)multipart/form-data數(shù)據(jù)格式

除了傳統(tǒng)的application/x-www-form-urlencoded表單舷蟀,我們另一個經(jīng)常用到的是上傳文件用的表單恤磷,這種表單的類型為multipart/form-data。
(1)如果用fiddler模擬請求的話野宜,請求頭和請求主體的內(nèi)容可以這樣構(gòu)造:
第一步扫步,先設置好請求頭格式,然后點擊upload file...


第二步速缨,上傳你的文件锌妻,這里我上傳一個png的圖片

upload.png

這是fiddler根據(jù)我們上傳的文件自動調(diào)整生成的請求,在請求頭中看到旬牲,我們需要選擇一段數(shù)據(jù)作為“分割邊界”(boundary屬性)仿粹,這個“邊界數(shù)據(jù)”不能在內(nèi)容其他地方出現(xiàn),一般來說使用一段從概率上說“幾乎不可能”的數(shù)據(jù)即可原茅。每次post瀏覽器都會生成一個隨機的30-40位長度的隨機字符串吭历,瀏覽器一般不會遍歷這次post的所有數(shù)據(jù)找到一個不可能出現(xiàn)在數(shù)據(jù)中的字符串,一般都是隨機生成擂橘。選擇了這個邊界之后晌区,瀏覽器便把它放在Content-Type 里面?zhèn)鬟f給服務器,服務器根據(jù)此邊界解析數(shù)據(jù)通贞。下面的數(shù)據(jù)便根據(jù)boundary劃分段朗若,每一段便是一項數(shù)據(jù)。(每個field被分成小部分昌罩,而且包含一個value是"form-data"的"Content-Disposition"的頭部哭懈;一個"name"屬性對應field的ID等等,文件的話包括一個filename)模擬請求之后茎用,從返回結(jié)果可以看到我們的請求數(shù)據(jù):

response.png

(2)如果用Requests模擬post請求的話遣总,請求可以這樣構(gòu)造:

url = 'http://www.example.com'
files = {'file': open('C://Users//Someone//Desktop//2.png', 'rb')}
r = requests.post(url, files=files)
print(r.text)

綜上,就是接口測試中fiddler與requests模擬post接口四種請求數(shù)據(jù)的構(gòu)造方法轨功,總結(jié)起來有利于在以后的接口測試工組過程中可以及時查閱旭斥。

同時,Requests庫還可以處理多部分編碼(Multipart-Encoded)的文件古涧,比如xls文件垂券,甚至改寫content-Type的報頭。
比如:

url = 'http://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

r = requests.post(url, files=files)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羡滑,一起剝皮案震驚了整個濱河市菇爪,隨后出現(xiàn)的幾起案子卒暂,更是在濱河造成了極大的恐慌,老刑警劉巖娄帖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昙楚,居然都是意外死亡近速,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門堪旧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來削葱,“玉大人,你說我怎么就攤上這事淳梦∥鲈遥” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵爆袍,是天一觀的道長首繁。 經(jīng)常有香客問我,道長陨囊,這世上最難降的妖魔是什么弦疮? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮蜘醋,結(jié)果婚禮上胁塞,老公的妹妹穿的比我還像新娘。我一直安慰自己压语,他們只是感情好啸罢,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胎食,像睡著了一般扰才。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斥季,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天训桶,我揣著相機與錄音,去河邊找鬼酣倾。 笑死舵揭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的躁锡。 我是一名探鬼主播午绳,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼映之!你這毒婦竟也來了拦焚?” 一聲冷哼從身側(cè)響起蜡坊,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赎败,沒想到半個月后秕衙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡僵刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年据忘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搞糕。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡勇吊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窍仰,到底是詐尸還是另有隱情汉规,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布驹吮,位于F島的核電站针史,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钥屈。R本人自食惡果不足惜悟民,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篷就。 院中可真熱鬧射亏,春花似錦、人聲如沸竭业。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽未辆。三九已至窟绷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咐柜,已是汗流浹背兼蜈。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拙友,地道東北人为狸。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像遗契,于是被迫代替她去往敵國和親辐棒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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