當(dāng)使用JMeter來測試HTTP Request時,在配置請求參數(shù)時初學(xué)者往往不得要領(lǐng),加之JMeter提供了靈活多變的參數(shù)附加形式,若不注意其中的訣竅與細(xì)節(jié),迷惑不解也在所難免.針對此種情況,本文逐一為大家解惑.
首先我們還是先要了解下HTTP協(xié)議的基礎(chǔ)知識.
1 HTTP報文格式
HTTP協(xié)議是Web客戶端與Web服務(wù)器之間通信規(guī)則的集合.協(xié)議有語法,語義與時序三個要素.在通信過程中通信雙方需要遵循基本的語法要素,而HTTP報文的格式體現(xiàn)的語法層次的基本要求.
一般來說HTTP報文(消息)可以分為HTTP請求報文與HTTP響應(yīng)報文,這里參考最新的HTTP1.1 RFC7230-7239,HTTP-message具體格式如下圖所示:
2 HTTP請求方法
2.1 HTTP/1.1標(biāo)準(zhǔn)方法
HTTP/1.0定義了三個方法:GET,HEAD,POST;HTTP/1.1在其基礎(chǔ)上擴充了PUT, DELETE, CONNECT, OPTIONS, TRACE方法;后來在RFC 5789中又新增了PATCH方法,可以看成是對PUT方法的補充.
2.2 WebDAV擴展方法
WebDAV(Web-based Distributed Authoring and Versioning)一種基于HTTP/1.1協(xié)議的通信協(xié)議葵擎。它擴展了HTTP/1.1哑蔫,在GET术羔、POST诡蜓、HEAD等幾個HTTP標(biāo)準(zhǔn)方法以外添加了一些新的方法滑潘,使應(yīng)用程序可對Web Server直接讀寫班巩,并支持寫文件鎖定(Locking)及解鎖(Unlock),還可以支持文件的版本控制氮兵。
WebDAV擴展的主要方法如下:
2.3 RESTful HTTP請求方法
REST(Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士論文中提出來的一種萬維網(wǎng)軟件架構(gòu)風(fēng)格裂逐,目的是便于不同軟件/程序在網(wǎng)絡(luò)(例如互聯(lián)網(wǎng))中互相傳遞信息。表現(xiàn)層狀態(tài)轉(zhuǎn)換是根基于超文本傳輸協(xié)議(HTTP)之上而確定的一組約束和屬性泣栈,是一種設(shè)計提供萬維網(wǎng)絡(luò)服務(wù)的軟件構(gòu)建風(fēng)格絮姆。符合或兼容于這種架構(gòu)風(fēng)格(簡稱為 REST 或 RESTful)的網(wǎng)絡(luò)服務(wù),允許客戶端發(fā)出以統(tǒng)一資源標(biāo)識符訪問和操作網(wǎng)絡(luò)資源的請求秩霍,而與預(yù)先定義好的無狀態(tài)操作集一致化篙悯。
HTTP請求方法在RESTful API中的典型應(yīng)用如下:
3 HTTP Request支持的請求方法
JMeter取樣器"HTTP Request"支持的請求方式與其實現(xiàn)方式有關(guān),在最新的JMeter5.2.1版本中有"HttpClient4"與"Java"兩種方式,具體細(xì)節(jié)如下表所示:
4 HTTP請求參數(shù)附加的位置
發(fā)送HTTP請求時,參數(shù)可以附加的位置可以是:
1.request-target;
2.message-body;
3.request-target與message-body兩者.
具體情形如下:
5 HTTP Content-Type
Content-Type首部字段
HTTP協(xié)議在"Content-Type"與"Accept"首部字段的值域中使用Internet Media Types.其目的是為了提供開放式,可擴展的數(shù)據(jù)類型以及類型協(xié)商.Media Types定義了某種數(shù)據(jù)格式以及各種數(shù)據(jù)處理模型,以便接收方根據(jù)上下文來正確處理接收到的數(shù)據(jù).
其語法格式為:
media-type = type "/" subtype *( OWS ";" OWS parameter )
type = token
subtype = token
"Content-Type"首部字段等價于"media-type".
Content-Type = media-type
Content-Type: application/soap+xml;charset=UTF-8;action="[http://WebXml.com.cn/getSupportCity](https://link.zhihu.com/?target=http%3A//webxml.com.cn/getSupportCity)"
其中:
"application"是MIME主類型
"soap+xml"是"子類型"
";"是類型與參數(shù)的分隔符,前后可帶可選的空白(OWS)
"charset"與"action"是兩個參數(shù),參數(shù)之間也以";"分隔.
常見的Content-Type值域
主類型包含獨立類型與Multipart類型兩大類:
* 獨立類型
獨立類型表明了對文件的分類,可以是如下之一:
* Multipart 類型
multipart/form-data
multipart/byteranges
Multipart 類型表示細(xì)分領(lǐng)域的文件類型的種類铃绒,經(jīng)常對應(yīng)不同的 MIME 類型鸽照。這是復(fù)合文件的一種表現(xiàn)方式。multipart/form-data 可用于聯(lián)系 HTML Forms 和 POST 方法颠悬,此外 multipart/byteranges使用狀態(tài)碼206 Partial Content來發(fā)送整個文件的子集矮燎,而HTTP對不能處理的復(fù)合文件使用特殊的方式:將信息直接傳送給瀏覽器(這時可能會建立一個“另存為”窗口,但是卻不知道如何去顯示內(nèi)聯(lián)文件赔癌。)
6 JMeter附件參數(shù)規(guī)則
6. 1 可帶查詢字符串的請求方法
在HTTP請求中,查詢字符串是以"key=value"方式表示的字符串?dāng)?shù)據(jù),多個"key=value"之間以"&"連接,形如"k1=v1&k2=v2&k3=v3&...&kn=vn"."key"在某些情況下是可選的,比如:
"id=100&31415926535897932",后面的參數(shù)"key"省略了,沒有"key"的參數(shù)稱為"無名參數(shù)".同樣"value"也是可選的,比如:"username=xxx&passord=yyy&submit=","sumbmit"沒有對應(yīng)的值,沒有"value"的參數(shù)稱為"無值參數(shù)".
GET請求帶查詢字符串是最常見的诞外,除此之外,DELETE灾票、POST峡谊、PUT、PATCH也可以攜帶查詢字符串刊苍,不過JMeter處理的方式不同:
1) GET既们、HEAD、DELETE將查詢字符串附加在請求request-target之后
如圖所示:
2) POST正什、PUT啥纸、PATCH將查詢字符串放在請求message-body中單獨發(fā)送
6.2 查詢字符串設(shè)置
查詢字符串設(shè)置有如下四種方式:
1.直接放在Path配置項中
2.在"Parameters”選項卡通過設(shè)置"name/value"對生成
下面的配置會生成"a=1&b=2&c=3"的查詢字符串:
3.根據(jù)“Parameters”選項卡中的“name/value”對生成字符串并追加到"Path"中的查詢字符串末尾(兩者以&連接),此規(guī)則僅對于GET請求有效婴氮。
下面的配置會生成"k=v&a=1&b=2&c=3"的查詢字符串:
4.放在"Body Data"選項卡中
注意:對于GET請求,將查詢字符串寫在"Body Data"中不是不允許,JMeter允許你這么做,但是這樣取決于服務(wù)器是否支持.
6.3 Parameters無名參數(shù)處理
在"Parameters"選項卡中,JMeter允許設(shè)置"無名參數(shù)",也就是沒有"Name"的參數(shù).
下面分兩種情況討論:
1.對于POST斯棒、PUT與PATCH方法,且沒有上傳文件
則將參數(shù)值首尾相連作為message-body主经。這些值的末尾不會自動加入行結(jié)束符荣暮,可以調(diào)用${__char(13,10)}來插入CRLF。
2.對于GET,HEAD方法
若參數(shù)沒有參數(shù)名旨怠,則JMeter會忽略該參數(shù)渠驼。
下面的例子中,參數(shù)值"1"與"3"被JMeter忽略了:
對GET方法,若所有參數(shù)沒有設(shè)置"name",還是會作為message-body發(fā)送.
在"Parameters"中所有參數(shù)沒有設(shè)置"Name",等同于在"Body Data"中設(shè)置.
6.4 帶無名參數(shù)的請求
當(dāng)JMeter發(fā)送如下類型的HTTP請求時:
1)GWT RPC HTTP
2)JSON REST HTTP
3)XML REST HTTP
4)SOAP HTTP
可以看成是HTTP請求附加了"無名參數(shù)".
這些參數(shù)可以在如下兩個地方設(shè)置:
1)在"Body Data"選項卡中設(shè)置
在此模式下,除了最后一行之外鉴腻,每行末自動附加CRLF迷扇。要在最后一行數(shù)據(jù)之后發(fā)送CRLF百揭,只需確保其后面有一空行即可。
2)在"Parameters"選項卡中設(shè)置
不設(shè)置"name",只設(shè)置"value".
6.5 message-body設(shè)置
在JMeter中,HTTP請求的message-body有如下三種設(shè)置方式:
1)在“Parameters"選項卡中蜓席,不設(shè)置"Name"
參見6.3節(jié)與6.4節(jié)內(nèi)容
2)將請求參數(shù)放在“Body Data”選項卡中
參見6.3節(jié)與6.4節(jié)內(nèi)容
3)在“File Upload”選項卡中器一,不設(shè)置“Parameter Name”
但需要設(shè)置“MIME Type”,其值為資源對應(yīng)的MIME類型.
JMeter允許將message-body保存到外部文件中,再從文件中讀取數(shù)據(jù)發(fā)送HTTP請求.
下面看一個SOAP HTTP請求的例子:
POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: ws.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 388
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getSupportCity xmlns="http://WebXml.com.cn/">
<byProvinceName>string</byProvinceName>
</getSupportCity>
</soap12:Body>
</soap12:Envelope>
先將發(fā)送的SOAP消息保存到test.txt文件中,在"File Upload"選項卡中,設(shè)置:
i)"File Path": 文件路徑(D:/testdata/test.txt)
ii)"Parameter Name": 不設(shè)置,為空
iii)"MIME Type": 設(shè)置為SOAP1.2的MIME類型
如下圖所示:
響應(yīng)結(jié)果顯示"POST Data"取自于外部文件中:
6.6 message-body與Content-Type設(shè)置
一般來說,對于帶有message-body的HTTP請求,設(shè)置Content-Type才有意義.
對于GET,HEAD,DELETE等不帶message-body的請求,不需要設(shè)置Content-Type,但是一旦設(shè)置了,JMeter在發(fā)送HTTP請求時還是會帶上該首部字段.
JMeter提供了"Parameters","Body Data"與"Files Upload"三個選項卡可以附加HTTP請求參數(shù).
附加的位置不同,其默認(rèn)的Content-Type也不盡相同,其規(guī)則如下:
6.6.1 僅附加在Parameters且Name不全為空
此種情況要求僅在"Parameters"選項卡中設(shè)置參數(shù),并且Name不能全為空.
默認(rèn)Content-Type為"application/x-www-form-urlencoded".
下面是一個例子:
6.6.2 僅附加在Parameters且Name全為空
此種情況要求僅在"Parameters"選項卡中設(shè)置參數(shù),并且Name全為空.
默認(rèn)Content-Type為"text/plain".
下面是一個例子:
6.6.3 僅附加在Body Data
此種情況要求僅在"Body Data"選項卡中設(shè)置參數(shù).
默認(rèn)Content-Type為"text/plain".
這樣6.6.2節(jié)中講述的"僅附加在Parameters且Name全為空"的情況是等價的.
6.6.4 僅附加在Files Upload且Parameter Name不為空
此種情況要求僅在"Files Upload"選項卡中設(shè)置參數(shù),并且"Parameter Name"不能為空.
默認(rèn)Content-Type為"multipart/form-data".
下面是一個例子:
6.6.5 僅附加在Files Upload且Parameter Name為空
此種情況要求僅在"Files Upload"選項卡中設(shè)置參數(shù),并且"Parameter Name"為空.
則Content-Type值與設(shè)置的"MIME Type"值一致.
下面是一個例子:
6.6.6 附加在Parameters與Files Upload兩者中
此種情況在"Parameters"與"Files Upload"選項卡兩者中都設(shè)置了參數(shù),并且"Files Upload"選項卡中的"Parameter Name"不能為空.
默認(rèn)Content-Type為"multipart/form-data".
6.6.7 使用指定的Content-Type
為了能使服務(wù)器正確解析message-body,有時需要指定合適的Content-Type,可以在適當(dāng)位置添加一個"HTTP Header Manager"配置元件,并在其中添加一個首部字段,"name"設(shè)置為"Content-Type","value"設(shè)置為正確的"MIME"類型即可,在該配置元件的作用域范圍內(nèi),會覆蓋默認(rèn)的Content-Type.
設(shè)置如下圖示: