关于HTTP请求取样器

JMeter提供多种取样器,HTTP取样器(HTTP Sampler)无疑是最核心的一个。HTTP取样器是用来模拟客户端和服务器之间HTTP请求和接收响应的工具,可以发送各种类型的HTTP请求,如GET、POST、PUT、DELETE等。

HTTP取样器控制面板中包含元素:

  • 名称、注释

  • web服务器

  • HTTP请求

  • 参数

  • 消息体数据

  • 文件上传

  • 客户端实现

  • 超时

  • 从HTML文件获取所有内含的资源

  • 源地址

  • 代理服务器

  • 其他任务

使用示例脚本,需下载示例接口源码并运行。

web服务器

确保IP/域名、端口协议正确无误。


HTTP请求

确保请求方式、路径正确无误。内容编码最好输入UTF-8(基本兼容全部语言),防止接口解析时乱码。


跟随重定向

HTTP请求取样器的默认选择。Jmeter会对状态码302、30X的响应,重定向新的地址,勾选跟随重定向时,Jmeter会记录重定向过程内容(可在查看结果树中查看)。

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTPS://www.zhihu.com

  • 取样器的请求方式:GET

运行结果

HTTP请求从开始到结束,有两步。第一步是请求HTTPS://www.zhihu.com,知乎响应一个重定向链接://www.zhihu.com/signin?next=%2F。第二步就是重定向至链接。Jmeter会记录重定向过程内容。


自动重定向

勾选自动重定向时,Jmeter不会记录重定向过程内容。

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • HTTP请求取样器中勾选自动重定向

  • 取样器的请求地址:HTTPS://www.zhihu.com

  • 取样器的请求方式:GET

运行结果

这次就没有记录重定向过程内容了。


使用KeepAlive

选中该选项,JMeter和目标服务器之间使用Keep-Alive方式进行HTTP通信,默认选中。keep-alive属性,用于建立长连接,可以避免连接频繁建立和释放的开销。有兴趣的可以搜索HTTP的Keep-Alive模式,详细了解。


与浏览器兼容的头

没有发现有什么作用。希望有知道的读者可以评论。


GET请求

GET请求,请求参数一般都直接跟在url后面,没有参数类型。当然也可以请求参数不跟在url后面,不过比较少见。

路径传参

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/GET/?data=请求地址传参

  • 取样器的请求方式:GET

运行结果

请求数据中标红部分-GET http://127.0.0.1:5000/GET/?data=请求地址传参中的data=请求地址传参就是传的参数。

参数传参

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:`HTTP://127.0.0.1:5000/GET/

  • 取样器的请求方式:GET

  • 取样器下的参数中添加参数,名称为:data,值为:请求地址传参

运行结果

结果与使用路径传参时一样。

消息体传参

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/GET_DATA/

  • 取样器的请求方式:GET

  • 取样器下的消息体中添加参数:消息体传参

运行结果

请求数据中标红部分-GET data中的数据代表我们成功传参消息体参数,Jmeter还自动指定了参数类型为:text/plain(Jmeter会默认文本)。

不仅文本,还可以传参json、xml、html等格式内容,但需要使用消息头管理器指定对应参数类型。

文件上传

GET请求本身不支持文件上传,但可以使用 BeanShell 脚本处理文件下载和上传。比如下面的脚本:


import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;

// 处理文件
String filePath = "文件路径";
byte[] fileContent = Files.readAllBytes(Paths.get(filePath));
String encodedFile = Base64.getEncoder().encodeToString(fileContent);

// 将编码后的文件内容作为参数添加
sampler.getArguments().addArgument("fileContent", encodedFile);

基本上没有GET请求上传文件的场景,这里就不演示了。


POST请求

POST请求,请求数据不会显示在url中,可以使用多种类型的参数传递数据到服务器。

常见的POST请求参数类型包括:

  • 表单数据:

    Content-Type: application/x-www-form-urlencoded

    数据格式类似于URL查询参数(key1=value1&key2=value2)

  • 多部分表单数据:

    Content-Type: multipart/form-data

    通常用于文件上传,可以包含多个字段和文件。每个部分都有自己的Content-Type和Content-Disposition。

  • 原始数据(raw):

    可以是任意格式的数据,例如JSON、XML、纯文本等。 Content-Type:application/json(JSON数据)、application/xml(XML数据)、text/plain(纯文本)、其他根据需要的类型

application/x-www-form-urlencoded

application/x-www-from-urlencoded会将表单内的数据转换为键值对,比如name=JZY&age = 18

POST请求且以参数传参时,Jmeter会自动指定Content-Type为:application/x-www-form-urlencoded。如想指定其他类型,需使用请求头管理器。

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/POST_FROM/

  • 取样器的请求方式:POST

  • 取样器的参数中添加参数。名称1为:data,值1为:JZY;名称2为:data1,值2为:姜振园

运行结果

Content-Type为:application/x-www-form-urlencoded; charset=UTF-8

POST data是键值对形式:data=jzy&data1=%E5%A7%9C%E6%8C%AF%E5%9B%AD(中文只能这样显示)

POST&multipart/form-data

multipart/form-data会将表单的数据处理为一条消息,以标签为单元,用分隔符分开,可以包含文件。就像这样:

POST /profile HTTP/1.1
HOST: example.com
Content-Type: multipart/form-data; boundary=example-part-boundary    
# multipart/form-data; boundary=example-part-boundary表示这个请求的的消息类型是 
# multipart-form-data,每个 part 之间的边界为 example-part-boundary。
# example-part-boundary是一段很长的字符串,如bqtFfLzQXUbOvsHrs8eOO9kIlZ30hA。

--bqtFfLzQXUbOvsHrs8eOO9kIlZ30hA
Content-Disposition: form-data; name="username"
Content-Type: text/plain

Nicholas
# 第一个 part 的类型为 text/plain,它在表单上对应的 key 为 username,value 为 Nicholas
--bqtFfLzQXUbOvsHrs8eOO9kIlZ30hA
Content-Disposition: form-data; name="address"
Content-Type: application/json

{
    "country": "China",
    "city": "Beijing"
}
# 第二个 part 的类型为 application/json,它在表单上对应的 key 为 address。

--bqtFfLzQXUbOvsHrs8eOO9kIlZ30hA
Content-Disposition: form-data; name="avatar"; filename="my_avatar.jpeg"
Content-Type: image/jpeg

<binary-image data>
# 第三个 part 的数据类型为 image/jpeg,它在表单上对应的 key 为 avatar,
# 并且 part 的头部还附加了文件名相关的元数据 filename="my_avatar.jpeg。
--bqtFfLzQXUbOvsHrs8eOO9kIlZ30hA--
# 最后面的 --example-part-boundary-- 表示整个 multipart 消息的结束。

这种方式可以将数据分为很多部分,它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型:Content-disposition,用来说明字段的一些信息。

每部分都是以-boundary开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以-boundary-标示结束。

POST请求且请求参数包含一般参数&文件时,Jmeter会自动指定参数类型为multipart/form-data

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/POST_FROM_DATA/

  • 取样器的请求方式:POST

  • 取样器的参数中添加参数,名称1为:username,值1为:JZY;名称2为:address,值2为:{"country": "中国","city": "杭州" },内容类型为:application/json

  • 取样器的参数中添加文件上传。文件名称为:正确的文件路径(如图片路径),参数名称为:image

运行结果

Content-Type为:
Content-Type: multipart/form-data; boundary=qGB9gYtq24YAGWpEpIW_3-nzAAvClSvDznH66fco; charset=UTF-8,其中boundary是边界字符串。请求参数也是典型的FromData。

另外可去C:\image下查看刚上传的图片或文件。

POST请求&&请求参数包含一般参数&&不上传文件,请求参数类型默认application/x-www-form-urlencoded。 这种场景下,如果想要指定请求参数类型为multipart/ form-data,可以勾选对POST使用multipart/ form-data,读者可以试下。


POST&text/plain

text/plain用于发送纯文本内容,不对特殊字符进行编码。

消息体中输入相应内容,Jmeter会自动指定参数类型为text/plain

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/api/HTTPRequest2/

  • 取样器的请求方式:POST

  • 取样器的消息体中添加数据:作者 JZY

运行结果

Content-Type为:text/plain; charset=UTF-8,请求参数就是纯文本:作者 JZY


application/json

发送JSON字符串时,就需要用application/json,也是比较常用的一种方式。

Jmeter中发送JSON字符串,需要消息体中输入JSON格式内容&消息头管理器添加content-type:application/json

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/POST_JSON/

  • 取样器的请求方式:POST

  • 取样器的消息体数据:{"爱好":"电影"}

  • 取样器下添加HTTP信息请求头管理器(右键-添加-配置元件-HTTP信息请求头管理器)

  • HTTP信息请求头管理器中添加信息头,名称为:content-type,值为:application/json

运行结果

Content-Type为:application/json,请求参数就是JSON字符串:{"爱好":"电影"}

还可以请求HTML、XML、CSS、JS等内容,上传方法与JSON类似。

消息体中输入相应格式内容&信息头管理器中添加对应的Content-Type

  • HTMl的请求参数类型是text/html

  • XML的请求参数类型是text/XML

  • CSS的请求参数类型是text/CSS

  • JS的请求参数类型是text/JS

读者可以尝试一下。


binary

如要传二进制文件,可Content-Type:application/octet-stream(binary)&消息体中输入二进制数据。

文本转二进制工具

示例Jmeter脚本

  • 测试计划下添加线程组、查看结果树

  • 线程组下添加HTTP请求取样器

  • 取样器的请求地址:HTTP://127.0.0.1:5000/POST_BINARY/

  • 取样器的请求方式:POST

  • 取样器的消息体数据:101110000001111 1000101111110100

  • 取样器下添加HTTP信息请求头管理器(右键-添加-配置元件-HTTP信息请求头管理器)

  • HTTP信息请求头管理器中添加信息头,名称为:content-type,值为:application/octet-stream

运行结果

Content-Type为:application/octet-stream,请求参数就是二进制流:101110000001111 1000101111110100

Http请求默认值

Jmeter中提供配置元件HTTP请求默认值,它提供默认能力。比如其指定了IP、端口,其作用域下任何没有指定IP、端口的HTTP取样器都会使用HTTP请求默认值中IP、端口

其他参数的逻辑一致。HTTP请求默认值中不能进行文件上传。



© 转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-ND 4.0