关于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
...