Jmeter

JMeter认知系列(4)HTTP Request附加参数剖析

2020-04-14  本文已影响0人  熊一二

当使用JMeter来测试HTTP Request时,在配置请求参数时初学者往往不得要领,加之JMeter提供了灵活多变的参数附加形式,若不注意其中的诀窍与细节,迷惑不解也在所难免.针对此种情况,本文逐一为大家解惑.

首先我们还是先要了解下HTTP协议的基础知识.

1 HTTP报文格式

HTTP协议是Web客户端与Web服务器之间通信规则的集合.协议有语法,语义与时序三个要素.在通信过程中通信双方需要遵循基本的语法要素,而HTTP报文的格式体现的语法层次的基本要求.

一般来说HTTP报文(消息)可以分为HTTP请求报文与HTTP响应报文,这里参考最新的HTTP1.1 RFC7230-7239,HTTP-message具体格式如下图所示:

image

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

image

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

image

2.3 RESTful HTTP请求方法

REST(Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士论文中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。表现层状态转换是根基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。符合或兼容于这种架构风格(简称为 REST 或 RESTful)的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化。

HTTP请求方法在RESTful API中的典型应用如下:

image

3 HTTP Request支持的请求方法

JMeter取样器"HTTP Request"支持的请求方式与其实现方式有关,在最新的JMeter5.2.1版本中有"HttpClient4"与"Java"两种方式,具体细节如下表所示:

image

4 HTTP请求参数附加的位置

发送HTTP请求时,参数可以附加的位置可以是:

1.request-target;
2.message-body;
3.request-target与message-body两者.

具体情形如下:

image

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=UTF-8;action="[http://WebXml.com.cn/getSupportCity](https://link.zhihu.com/?target=http%3A//webxml.com.cn/getSupportCity)"

其中:

"application"是MIME主类型
"soap+xml"是"子类型"
";"是类型与参数的分隔符,前后可带可选的空白(OWS)
"charset"与"action"是两个参数,参数之间也以";"分隔.

常见的Content-Type值域

主类型包含独立类型与Multipart类型两大类:

* 独立类型

独立类型表明了对文件的分类,可以是如下之一:

image
* Multipart 类型

multipart/form-data
multipart/byteranges

Multipart 类型表示细分领域的文件类型的种类,经常对应不同的 MIME 类型。这是复合文件的一种表现方式。multipart/form-data 可用于联系 HTML Forms 和 POST 方法,此外 multipart/byteranges使用状态码206 Partial Content来发送整个文件的子集,而HTTP对不能处理的复合文件使用特殊的方式:将信息直接传送给浏览器(这时可能会建立一个“另存为”窗口,但是却不知道如何去显示内联文件。)

6 JMeter附件参数规则

6. 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之后

如图所示:

image

2) POST、PUT、PATCH将查询字符串放在请求message-body中单独发送

image

6.2 查询字符串设置

查询字符串设置有如下四种方式:

1.直接放在Path配置项中

image

2.在"Parameters”选项卡通过设置"name/value"对生成

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

image

3.根据“Parameters”选项卡中的“name/value”对生成字符串并追加到"Path"中的查询字符串末尾(两者以&连接),此规则仅对于GET请求有效。

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

image

4.放在"Body Data"选项卡中

image

注意:对于GET请求,将查询字符串写在"Body Data"中不是不允许,JMeter允许你这么做,但是这样取决于服务器是否支持.

6.3 Parameters无名参数处理

在"Parameters"选项卡中,JMeter允许设置"无名参数",也就是没有"Name"的参数.

下面分两种情况讨论:

1.对于POST、PUT与PATCH方法,且没有上传文件

则将参数值首尾相连作为message-body。这些值的末尾不会自动加入行结束符,可以调用${__char(13,10)}来插入CRLF。

image image

2.对于GET,HEAD方法

若参数没有参数名,则JMeter会忽略该参数。

下面的例子中,参数值"1"与"3"被JMeter忽略了:

对GET方法,若所有参数没有设置"name",还是会作为message-body发送.

在"Parameters"中所有参数没有设置"Name",等同于在"Body Data"中设置.

image

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

image

2)在"Parameters"选项卡中设置

不设置"name",只设置"value".

image

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>
    <getSupportCity xmlns="http://WebXml.com.cn/">
      <byProvinceName>string</byProvinceName>
    </getSupportCity>
  </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类型

如下图所示:

image

响应结果显示"POST Data"取自于外部文件中:

image

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

下面是一个例子:

image

6.6.2 仅附加在Parameters且Name全为空

此种情况要求仅在"Parameters"选项卡中设置参数,并且Name全为空.

默认Content-Type为"text/plain".

下面是一个例子:

image

6.6.3 仅附加在Body Data

此种情况要求仅在"Body Data"选项卡中设置参数.

默认Content-Type为"text/plain".

这样6.6.2节中讲述的"仅附加在Parameters且Name全为空"的情况是等价的.

image

6.6.4 仅附加在Files Upload且Parameter Name不为空

此种情况要求仅在"Files Upload"选项卡中设置参数,并且"Parameter Name"不能为空.

默认Content-Type为"multipart/form-data".

下面是一个例子:

image

6.6.5 仅附加在Files Upload且Parameter Name为空

此种情况要求仅在"Files Upload"选项卡中设置参数,并且"Parameter Name"为空.

则Content-Type值与设置的"MIME Type"值一致.

下面是一个例子:

image

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.

设置如下图示:

image
上一篇下一篇

猜你喜欢

热点阅读