当使用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
<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.
设置如下图示:
来源:CSDN
作者:川石信息
链接:https://blog.csdn.net/chuanshixx/article/details/103714935