前情: 在平常的接口測試工做中,模擬接口請求一般有兩種方法, 利用工具來模擬,好比fiddler,postman,poster,soapUI等 利用代碼來模擬,使用到一些網絡模塊,好比HttpClient,或者requests等 Fiddler是一個簡單的http協議調試代理工具,它界面友好,易於操做,是調試網絡,抓取請求的利器之一。 Requests包是趁着目前如火如荼的爬蟲風潮而流行起來的Python的第三方包,使用簡單,對於不須要對網絡底層模塊有太多瞭解又想實現接口測試的測試人員來講簡直不要太友好。 在接口測試中,接口一般是GET請求或者POST請求。如下是對接口測試中常見的四種Post請求數據方式進行一個詳細的講解: post請求主體詳解 一個正常的post請求主要包括請求行,請求頭,請求主體 對於get請求來講沒有請求主體entity-body。對於post請求而言,不會對發送請求的數據格式進行限制,理論上你能夠發任意數據,可是服務器能不能處理就是另外一回事了。服務器收到數據後,如何解析數據呢?它會以請求頭中的Content-Type設置的內容來進行數據解析。肯定好Content-Type的格式以後,請求主體的數據格式也就肯定下來了。 Content-Type的格式有四種:分別是application/x-www-form-urlencoded(這也是默認格式)、application/json、text/xml以及multipart/form-data格式。 這些不一樣的post請求數據格式要經過HttpEntity來構造,有必要簡單理一下HttpClient的HttpEntity對象,由於全部的post請求數據均須要置於HttpEntity實體中進行發送。HttpEntity是一個接口,實現這個接口的具體類有不少,比較經常使用的是StringEntity、UrlEncodedFormEntity(繼承自StringEntity)、MultipartEntity。他們將在發送不一樣格式的post請求時被用到。接下來就詳細地介紹每一種數據格式對應的fiddler請求模擬和Requests請求模擬(Python實現)的實現狀況。 (一)application/x-www-form-urlencoded數據格式 在W3C官網上明確對這種數據格式進行了定義: 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請求最多見也是默認的數據提交格式。它要求數據名稱(name)和數據值(value)之間以等號相連,與另外一組name/value值之間用&相連。例如:parameter1=12345¶meter2=23456。將請求的內容進行格式化了,其實這個方法同時簡化的客戶端發送,也簡化了服務器端獲取,服務器經過getParameters(String name)便可獲取到傳送來的信息。這是最多見post提交數據的方式,以form表單形式提交數據。 (1)若是用fiddler模擬請求的話,請求頭和請求主體的內容能夠這樣構造: 模擬請求以後,從返回結果能夠查看到咱們的請求數據: (2)若是用Requests模擬post請求的話,請求能夠這樣構造: datas = {'parameter1':'12345','parameter2':'23456'} r = requests.post('http://example.com',data=datas) print(r.content) print(r.status_code) Reqeusts支持以form表單形式發送post請求,只須要將請求的參數構形成一個字典,而後傳給requests.post()的data參數便可。 **(二)application/json數據格式 ** application/json格式的請求頭是指用來告訴服務端post過去的消息主體是序列化後的 JSON 字符串。 (1)若是用fiddler模擬請求的話,請求頭和請求主體的內容能夠這樣構造: 模擬請求以後,從返回結果能夠看到咱們的請求數據: (2)若是用Requests模擬post請求的話,請求能夠這樣構造: url = 'http://www.example/post' s = json.dumps({'key1': 'value1', 'key2': 'value2'}) r = requests.post(url, data=s) print (r.text) 這裏咱們能夠發現Requests模擬post請求時,請求頭格式爲application/x-www-form-urlencoded與application/json的主要差異在於請求主體的構造格式(前者是鍵值對,後者是JSON串),前者直接用字典傳入,後者用json.dumps()函數將字典轉爲JSON串便可。 (三)text/xml數據格式 (1)若是用fiddler模擬請求的話,請求頭和請求主體的內容能夠這樣構造: xmlrequest.png 模擬請求以後,從返回結果能夠看到咱們的請求數據: xmlresponse.png (2)若是用Requests模擬post請求的話,請求能夠這樣構造: 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數據格式 除了傳統的application/x-www-form-urlencoded表單,咱們另外一個常常用到的是上傳文件用的表單,這種表單的類型爲multipart/form-data。 (1)若是用fiddler模擬請求的話,請求頭和請求主體的內容能夠這樣構造: 第一步,先設置好請求頭格式,而後點擊upload file... 第二步,上傳你的文件,這裏我上傳一個png的圖片 upload.png 這是fiddler根據咱們上傳的文件自動調整生成的請求,在請求頭中看到,咱們須要選擇一段數據做爲「分割邊界」(boundary屬性),這個「邊界數據」不能在內容其餘地方出現,通常來講使用一段從機率上說「幾乎不可能」的數據便可。每次post瀏覽器都會生成一個隨機的30-40位長度的隨機字符串,瀏覽器通常不會遍歷此次post的全部數據找到一個不可能出如今數據中的字符串,通常都是隨機生成。選擇了這個邊界以後,瀏覽器便把它放在Content-Type 裏面傳遞給服務器,服務器根據此邊界解析數據。下面的數據便根據boundary劃分段,每一段即是一項數據。(每一個field被分紅小部分,並且包含一個value是"form-data"的"Content-Disposition"的頭部;一個"name"屬性對應field的ID等等,文件的話包括一個filename)模擬請求以後,從返回結果能夠看到咱們的請求數據: response.png (2)若是用Requests模擬post請求的話,請求能夠這樣構造: 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接口四種請求數據的構造方法,總結起來有利於在之後的接口測試工組過程當中能夠及時查閱。 同時,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) 做者:CC先生之簡書 連接:https://www.jianshu.com/p/3c790e98ea8d 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。