新聞中心
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
濰城ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!這篇文章將為大家詳細講解有關(guān)python中的post有什么用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
在日常的接口測試工作中,模擬接口請求通常有兩種方法,利用工具來模擬,比如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設(shè)置的內(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¶meter2=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)造:
模擬請求之后,從返回結(jié)果可以看到我們的請求數(shù)據(jù):
(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)造:
第一步,先設(shè)置好請求頭格式,然后點擊upload file...
第二步,上傳你的文件,這里我上傳一個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ù):
(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)
關(guān)于python中的post有什么用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
文章名稱:python中的post有什么用-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://www.dlmjj.cn/article/cchcpj.html