JMeter認(rèn)知系列(4)HTTP Request附加參數(shù)剖析

當(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具體格式如下圖所示:

image

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

image

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

image

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)用如下:

image

3 HTTP Request支持的請求方法

JMeter取樣器"HTTP Request"支持的請求方式與其實現(xiàn)方式有關(guān),在最新的JMeter5.2.1版本中有"HttpClient4"與"Java"兩種方式,具體細(xì)節(jié)如下表所示:

image

4 HTTP請求參數(shù)附加的位置

發(fā)送HTTP請求時,參數(shù)可以附加的位置可以是:

1.request-target;
2.message-body;
3.request-target與message-body兩者.

具體情形如下:

image

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

* 獨立類型

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

image
* 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之后

如圖所示:

image

2) POST正什、PUT啥纸、PATCH將查詢字符串放在請求message-body中單獨發(fā)送

image

6.2 查詢字符串設(shè)置

查詢字符串設(shè)置有如下四種方式:

1.直接放在Path配置項中

image

2.在"Parameters”選項卡通過設(shè)置"name/value"對生成

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

image

3.根據(jù)“Parameters”選項卡中的“name/value”對生成字符串并追加到"Path"中的查詢字符串末尾(兩者以&連接),此規(guī)則僅對于GET請求有效婴氮。

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

image

4.放在"Body Data"選項卡中

image

注意:對于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。

image
image

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è)置.

image

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百揭,只需確保其后面有一空行即可。

image

2)在"Parameters"選項卡中設(shè)置

不設(shè)置"name",只設(shè)置"value".

image

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

如下圖所示:

image

響應(yīng)結(jié)果顯示"POST Data"取自于外部文件中:

image

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

下面是一個例子:

image

6.6.2 僅附加在Parameters且Name全為空

此種情況要求僅在"Parameters"選項卡中設(shè)置參數(shù),并且Name全為空.

默認(rèn)Content-Type為"text/plain".

下面是一個例子:

image

6.6.3 僅附加在Body Data

此種情況要求僅在"Body Data"選項卡中設(shè)置參數(shù).

默認(rèn)Content-Type為"text/plain".

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

image

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

此種情況要求僅在"Files Upload"選項卡中設(shè)置參數(shù),并且"Parameter Name"不能為空.

默認(rèn)Content-Type為"multipart/form-data".

下面是一個例子:

image

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

此種情況要求僅在"Files Upload"選項卡中設(shè)置參數(shù),并且"Parameter Name"為空.

則Content-Type值與設(shè)置的"MIME Type"值一致.

下面是一個例子:

image

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è)置如下圖示:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厨内,隨后出現(xiàn)的幾起案子祈秕,更是在濱河造成了極大的恐慌,老刑警劉巖雏胃,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件请毛,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞭亮,警方通過查閱死者的電腦和手機方仿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统翩,“玉大人仙蚜,你說我怎么就攤上這事〕Ш梗” “怎么了委粉?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娶桦。 經(jīng)常有香客問我贾节,道長,這世上最難降的妖魔是什么趟紊? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任氮双,我火速辦了婚禮,結(jié)果婚禮上霎匈,老公的妹妹穿的比我還像新娘。我一直安慰自己送爸,他們只是感情好铛嘱,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袭厂,像睡著了一般墨吓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纹磺,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天帖烘,我揣著相機與錄音,去河邊找鬼橄杨。 笑死秘症,一個胖子當(dāng)著我的面吹牛照卦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乡摹,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼役耕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了聪廉?” 一聲冷哼從身側(cè)響起瞬痘,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎板熊,沒想到半個月后框全,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡干签,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年竣况,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筒严。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡丹泉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸭蛙,到底是詐尸還是另有隱情摹恨,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布娶视,位于F島的核電站晒哄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肪获。R本人自食惡果不足惜寝凌,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孝赫。 院中可真熱鬧较木,春花似錦、人聲如沸青柄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽致开。三九已至峰锁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間双戳,已是汗流浹背虹蒋。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魄衅。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓峭竣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徐绑。 傳聞我的和親對象是個殘疾皇子邪驮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容