當使用JMeter來測試HTTP Request時,在配置請求參數時初學者往往不得要領,加之JMeter提供了靈活多變的參數附加形式,若不注意其中的訣竅與細節,迷惑不解也在所難免.針對此種情況,本文逐一為大家解惑.
首先我們還是先要了解下HTTP協定的基礎知識.
1、HTTP封包格式
HTTP協定是Web用戶端與Web伺服器之間通信規則的集合.協定有文法,語義與時序三個要素.在通信過程中通信雙方需要遵循基本的文法要素,而HTTP封包的格式展現的文法層次的基本要求.
一般來說HTTP封包(消息)可以分為HTTP請求封包與HTTP響應封包,這裡參考最新的HTTP1.1 RFC7230-7239,HTTP-message具體格式如下圖所示:

2、HTTP請求方法
2.1 HTTP/1.1标準方法
HTTP/1.0定義了三個方法:GET,HEAD,POST;HTTP/1.1在其基礎上擴充了PUT,DELETE,CONNECT,OPTIONS,TRACE方法;後來在RFC 5789中又新增了PATCH方法,可以看成是對PUT方法的補充.
2.2 WebDAV擴充方法
WebDAV(Web-based Distributed Authoring and Versioning)一種基于HTTP/1.1協定的通信協定。它擴充了HTTP/1.1,在GET、POST、HEAD等幾個HTTP标準方法以外添加了一些新的方法,使應用程式可對Web Server直接讀寫,并支援寫檔案鎖定(Locking)及解鎖(Unlock),還可以支援檔案的版本控制。WebDAV擴充的主要方法如下:
2.3 RESTful HTTP請求方法
REST(Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士論文中提出來的一種網際網路軟體架構風格,目的是便于不同軟體/程式在網絡(例如網際網路)中互相傳遞資訊。表現層狀态轉換是根基于超文本傳輸協定(HTTP)之上而确定的一組限制和屬性,是一種設計提供網際網路絡服務的軟體建構風格。符合或相容于這種架構風格(簡稱為 REST 或 RESTful)的網絡服務,允許用戶端發出以統一資源辨別符通路和操作網絡資源的請求,而與預先定義好的無狀态操作集一緻化。
HTTP請求方法在RESTful API中的典型應用如下:
3 HTTP Request支援的請求方法
JMeter取樣器"HTTP Request"支援的請求方式與其實作方式有關,在最新的JMeter5.2.1版本中有"HttpClient4"與"Java"兩種方式,具體細節如下表所示:
4 HTTP請求參數附加的位置
發送HTTP請求時,參數可以附加的位置可以是:
1.request-target;
2.message-body;
3.request-target與message-body兩者.
具體情形如下:
5 HTTP Content-Type
Content-Type首部字段
HTTP協定在"Content-Type"與"Accept"首部字段的值域中使用Internet Media Types.其目的是為了提供開放式,可擴充的資料類型以及類型協商.Media Types定義了某種資料格式以及各種資料處理模型,以便接收方根據上下文來正确處理接收到的資料.
其文法格式為:
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=UTF8;action=“http://WebXml.com.cn/getSupportCity”
其中:
"application"是MIME主類型
“soap+xml"是"子類型”
";"是類型與參數的分隔符,前後可帶可選的空白(OWS)
“charset"與"action"是兩個參數,參數之間也以”;"分隔.
常見的Content-Type值域
主類型包含獨立類型與Multipart類型兩大類:
獨立類型
獨立類型表明了對檔案的分類,可以是如下之一:
Multipart 類型
multipart/form-data
multipart/byteranges
Multipart 類型表示細分領域的檔案類型的種類,經常對應不同的 MIME 類型。這是複合檔案的一種表現方式。multipart/form-data 可用于聯系 HTML Forms 和 POST 方法,此外 multipart/byteranges使用狀态碼206 Partial Content來發送整個檔案的子集,而HTTP對不能處理的複合檔案使用特殊的方式:将資訊直接傳送給浏覽器(這時可能會建立一個“另存為”視窗,但是卻不知道如何去顯示内聯檔案。)
6 JMeter附件參數規則
- 1 可帶查詢字元串的請求方法
在HTTP請求中,查詢字元串是以"key=value"方式表示的字元串資料,多個"key=value"之間以"&“連接配接,形如"k1=v1&k2=v2&k3=v3&…&kn=vn”."key"在某些情況下是可選的,比如:
“id=100&31415926535897932”,後面的參數"key"省略了,沒有"key"的參數稱為"無名參數".同樣"value"也是可選的,比如:“username=xxx&passord=yyy&submit=”,“sumbmit"沒有對應的值,沒有"value"的參數稱為"無值參數”.
GET請求帶查詢字元串是最常見的,除此之外,DELETE、POST、PUT、PATCH也可以攜帶查詢字元串,不過JMeter處理的方式不同:
- GET、HEAD、DELETE将查詢字元串附加在請求request-target之後
如圖所示:
2) POST、PUT、PATCH将查詢字元串放在請求message-body中單獨發送
6.2 查詢字元串設定
查詢字元串設定有如下四種方式:
1.直接放在Path配置項中
2.在"Parameters”頁籤通過設定"name/value"對生成
下面的配置會生成"a=1&b=2&c=3"的查詢字元串:
3.根據“Parameters”頁籤中的“name/value”對生成字元串并追加到"Path"中的查詢字元串末尾(兩者以&連接配接),此規則僅對于GET請求有效。
下面的配置會生成"k=v&a=1&b=2&c=3"的查詢字元串:
4.放在"Body Data"頁籤中
注意:對于GET請求,将查詢字元串寫在"Body Data"中不是不允許,JMeter允許你這麼做,但是這樣取決于伺服器是否支援.
6.3 Parameters無名參數處理
在"Parameters"頁籤中,JMeter允許設定"無名參數",也就是沒有"Name"的參數.
下面分兩種情況讨論:
1.對于POST、PUT與PATCH方法,且沒有上傳檔案
則将參數值首尾相連作為message-body。這些值的末尾不會自動加入行結束符,可以調用${__char(13,10)}來插入CRLF。
2.對于GET,HEAD方法
若參數沒有參數名,則JMeter會忽略該參數。
下面的例子中,參數值"1"與"3"被JMeter忽略了:
對GET方法,若所有參數沒有設定"name",還是會作為message-body發送.
在"Parameters"中所有參數沒有設定"Name",等同于在"Body Data"中設定.
6.4 帶無名參數的請求
當JMeter發送如下類型的HTTP請求時:
1)GWT RPC HTTP
2)JSON REST HTTP
3)XML REST HTTP
4)SOAP HTTP
可以看成是HTTP請求附加了"無名參數".
這些參數可以在如下兩個地方設定:
1)在"Body Data"頁籤中設定
在此模式下,除了最後一行之外,每行末自動附加CRLF。要在最後一行資料之後發送CRLF,隻需確定其後面有一空行即可。
2)在"Parameters"頁籤中設定
不設定"name",隻設定"value".
6.5 message-body設定
在JMeter中,HTTP請求的message-body有如下三種設定方式:
1)在“Parameters"頁籤中,不設定"Name"
參見6.3節與6.4節内容
2)将請求參數放在“Body Data”頁籤中
參見6.3節與6.4節内容
3)在“File Upload”頁籤中,不設定“Parameter Name”
但需要設定“MIME Type”,其值為資源對應的MIME類型.
JMeter允許将message-body儲存到外部檔案中,再從檔案中讀取資料發送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
string
</soap12:Body>
</soap12:Envelope>
先将發送的SOAP消息儲存到test.txt檔案中,在"File Upload"頁籤中,設定:
i)“File Path”: 檔案路徑(D:/testdata/test.txt)
ii)“Parameter Name”: 不設定,為空
iii)“MIME Type”: 設定為SOAP1.2的MIME類型
如下圖所示:
響應結果顯示"POST Data"取自于外部檔案中:
6.6 message-body與Content-Type設定
一般來說,對于帶有message-body的HTTP請求,設定Content-Type才有意義.
對于GET,HEAD,DELETE等不帶message-body的請求,不需要設定Content-Type,但是一旦設定了,JMeter在發送HTTP請求時還是會帶上該首部字段.
JMeter提供了"Parameters","Body Data"與"Files Upload"三個頁籤可以附加HTTP請求參數.
附加的位置不同,其預設的Content-Type也不盡相同,其規則如下:
6.6.1 僅附加在Parameters且Name不全為空
此種情況要求僅在"Parameters"頁籤中設定參數,并且Name不能全為空.
預設Content-Type為"application/x-www-form-urlencoded".
下面是一個例子:
6.6.2 僅附加在Parameters且Name全為空
此種情況要求僅在"Parameters"頁籤中設定參數,并且Name全為空.
預設Content-Type為"text/plain".
下面是一個例子:
6.6.3 僅附加在Body Data
此種情況要求僅在"Body Data"頁籤中設定參數.
預設Content-Type為"text/plain".
這樣6.6.2節中講述的"僅附加在Parameters且Name全為空"的情況是等價的.
6.6.4 僅附加在Files Upload且Parameter Name不為空
此種情況要求僅在"Files Upload"頁籤中設定參數,并且"Parameter Name"不能為空.
預設Content-Type為"multipart/form-data".
下面是一個例子:
6.6.5 僅附加在Files Upload且Parameter Name為空
此種情況要求僅在"Files Upload"頁籤中設定參數,并且"Parameter Name"為空.
則Content-Type值與設定的"MIME Type"值一緻.
下面是一個例子:
6.6.6 附加在Parameters與Files Upload兩者中
此種情況在"Parameters"與"Files Upload"頁籤兩者中都設定了參數,并且"Files Upload"頁籤中的"Parameter Name"不能為空.
預設Content-Type為"multipart/form-data".
6.6.7 使用指定的Content-Type
為了能使伺服器正确解析message-body,有時需要指定合适的Content-Type,可以在适當位置添加一個"HTTP Header Manager"配置元件,并在其中添加一個首部字段,“name"設定為"Content-Type”,"value"設定為正确的"MIME"類型即可,在該配置元件的作用域範圍内,會覆寫預設的Content-Type.
設定如下圖示: