美文网首页Jmeter
JMeter认知系列(4)HTTP Request附加参数剖析

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

作者: 熊一二 | 来源:发表于2020-04-14 21:47 被阅读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

    相关文章

      网友评论

        本文标题:JMeter认知系列(4)HTTP Request附加参数剖析

        本文链接:https://www.haomeiwen.com/subject/djixvhtx.html