天天看點

最新:JMeter性能測試Http Request附加參數全剖析

當使用JMeter來測試HTTP Request時,在配置請求參數時初學者往往不得要領,加之JMeter提供了靈活多變的參數附加形式,若不注意其中的訣竅與細節,迷惑不解也在所難免.針對此種情況,本文逐一為大家解惑.

首先我們還是先要了解下HTTP協定的基礎知識.

1、HTTP封包格式

HTTP協定是Web用戶端與Web伺服器之間通信規則的集合.協定有文法,語義與時序三個要素.在通信過程中通信雙方需要遵循基本的文法要素,而HTTP封包的格式展現的文法層次的基本要求.

一般來說HTTP封包(消息)可以分為HTTP請求封包與HTTP響應封包,這裡參考最新的HTTP1.1 RFC7230-7239,HTTP-message具體格式如下圖所示:

最新:JMeter性能測試Http Request附加參數全剖析

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方法的補充.

最新:JMeter性能測試Http Request附加參數全剖析

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擴充的主要方法如下:

最新:JMeter性能測試Http Request附加參數全剖析

2.3 RESTful HTTP請求方法

REST(Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士論文中提出來的一種網際網路軟體架構風格,目的是便于不同軟體/程式在網絡(例如網際網路)中互相傳遞資訊。表現層狀态轉換是根基于超文本傳輸協定(HTTP)之上而确定的一組限制和屬性,是一種設計提供網際網路絡服務的軟體建構風格。符合或相容于這種架構風格(簡稱為 REST 或 RESTful)的網絡服務,允許用戶端發出以統一資源辨別符通路和操作網絡資源的請求,而與預先定義好的無狀态操作集一緻化。

HTTP請求方法在RESTful API中的典型應用如下:

最新:JMeter性能測試Http Request附加參數全剖析

3 HTTP Request支援的請求方法

JMeter取樣器"HTTP Request"支援的請求方式與其實作方式有關,在最新的JMeter5.2.1版本中有"HttpClient4"與"Java"兩種方式,具體細節如下表所示:

最新:JMeter性能測試Http Request附加參數全剖析

4 HTTP請求參數附加的位置

發送HTTP請求時,參數可以附加的位置可以是:

1.request-target;

2.message-body;

3.request-target與message-body兩者.

具體情形如下:

最新:JMeter性能測試Http Request附加參數全剖析

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類型兩大類:

獨立類型

獨立類型表明了對檔案的分類,可以是如下之一:

最新:JMeter性能測試Http Request附加參數全剖析

Multipart 類型

multipart/form-data

multipart/byteranges

Multipart 類型表示細分領域的檔案類型的種類,經常對應不同的 MIME 類型。這是複合檔案的一種表現方式。multipart/form-data 可用于聯系 HTML Forms 和 POST 方法,此外 multipart/byteranges使用狀态碼206 Partial Content來發送整個檔案的子集,而HTTP對不能處理的複合檔案使用特殊的方式:将資訊直接傳送給浏覽器(這時可能會建立一個“另存為”視窗,但是卻不知道如何去顯示内聯檔案。)

6 JMeter附件參數規則

  1. 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處理的方式不同:

  1. GET、HEAD、DELETE将查詢字元串附加在請求request-target之後

如圖所示:

最新:JMeter性能測試Http Request附加參數全剖析

2) POST、PUT、PATCH将查詢字元串放在請求message-body中單獨發送

最新:JMeter性能測試Http Request附加參數全剖析

6.2 查詢字元串設定

查詢字元串設定有如下四種方式:

1.直接放在Path配置項中

最新:JMeter性能測試Http Request附加參數全剖析

2.在"Parameters”頁籤通過設定"name/value"對生成

下面的配置會生成"a=1&b=2&c=3"的查詢字元串:

最新:JMeter性能測試Http Request附加參數全剖析

3.根據“Parameters”頁籤中的“name/value”對生成字元串并追加到"Path"中的查詢字元串末尾(兩者以&連接配接),此規則僅對于GET請求有效。

下面的配置會生成"k=v&a=1&b=2&c=3"的查詢字元串:

最新:JMeter性能測試Http Request附加參數全剖析

4.放在"Body Data"頁籤中

最新:JMeter性能測試Http Request附加參數全剖析

注意:對于GET請求,将查詢字元串寫在"Body Data"中不是不允許,JMeter允許你這麼做,但是這樣取決于伺服器是否支援.

6.3 Parameters無名參數處理

在"Parameters"頁籤中,JMeter允許設定"無名參數",也就是沒有"Name"的參數.

下面分兩種情況讨論:

1.對于POST、PUT與PATCH方法,且沒有上傳檔案

則将參數值首尾相連作為message-body。這些值的末尾不會自動加入行結束符,可以調用${__char(13,10)}來插入CRLF。

最新:JMeter性能測試Http Request附加參數全剖析
最新:JMeter性能測試Http Request附加參數全剖析

2.對于GET,HEAD方法

若參數沒有參數名,則JMeter會忽略該參數。

下面的例子中,參數值"1"與"3"被JMeter忽略了:

對GET方法,若所有參數沒有設定"name",還是會作為message-body發送.

在"Parameters"中所有參數沒有設定"Name",等同于在"Body Data"中設定.

最新:JMeter性能測試Http Request附加參數全剖析

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,隻需確定其後面有一空行即可。

最新:JMeter性能測試Http Request附加參數全剖析

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類型

如下圖所示:

最新:JMeter性能測試Http Request附加參數全剖析

響應結果顯示"POST Data"取自于外部檔案中:

最新:JMeter性能測試Http Request附加參數全剖析

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".

下面是一個例子:

最新:JMeter性能測試Http Request附加參數全剖析

6.6.2 僅附加在Parameters且Name全為空

此種情況要求僅在"Parameters"頁籤中設定參數,并且Name全為空.

預設Content-Type為"text/plain".

下面是一個例子:

最新:JMeter性能測試Http Request附加參數全剖析

6.6.3 僅附加在Body Data

此種情況要求僅在"Body Data"頁籤中設定參數.

預設Content-Type為"text/plain".

這樣6.6.2節中講述的"僅附加在Parameters且Name全為空"的情況是等價的.

最新:JMeter性能測試Http Request附加參數全剖析

6.6.4 僅附加在Files Upload且Parameter Name不為空

此種情況要求僅在"Files Upload"頁籤中設定參數,并且"Parameter Name"不能為空.

預設Content-Type為"multipart/form-data".

下面是一個例子:

最新:JMeter性能測試Http Request附加參數全剖析

6.6.5 僅附加在Files Upload且Parameter Name為空

此種情況要求僅在"Files Upload"頁籤中設定參數,并且"Parameter Name"為空.

則Content-Type值與設定的"MIME Type"值一緻.

下面是一個例子:

最新:JMeter性能測試Http Request附加參數全剖析

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.

設定如下圖示:

最新:JMeter性能測試Http Request附加參數全剖析

繼續閱讀