如何在JMeter中存储JSON响应ID列表并依次传入HTTP请求
问题背景
我拿到如下JSON响应:
[
{
"firstName": "William",
"lastName":"Shakespeare",
"Title": "Mr",
"id": "1",
"books": [
{
"id": "WS1",
"title": "King John",
"year":"1596"
},
{
"id": "WS2",
"title": "Julius Caesar",
"year": "1599"
},
{
"id": "WS3",
"title": "Romeo and Juliet",
"year": "1595"
}
],
"Nationality": "English"
}
]
这个响应里包含3个书籍ID,我需要把它们存成列表,再依次传入3个独立的HTTP请求中。请问怎么用后置处理器实现这个需求?
JMeter实现方案
1. 用JSON Extractor提取所有书籍ID
在返回上述JSON的请求下,添加JSON Extractor后置处理器,配置如下:
- 应用范围:当前请求
- 引用名称:
bookIds - JSON Path表达式:
$[0].books[*].id - 匹配数字:
-1(表示提取所有匹配的ID) - 默认值:可填
NOT_FOUND(可选)
配置完成后,JMeter会自动生成一组变量:
bookIds_1=WS1、bookIds_2=WS2、bookIds_3=WS3bookIds_matchNr=3(存储提取到的ID总数)
2. 用循环控制器遍历ID
添加循环控制器,设置循环次数为${bookIds_matchNr},这样控制器会根据提取到的ID数量自动执行对应次数。
3. 在HTTP请求中引用当前ID
在循环控制器下添加需要执行的HTTP请求,在需要传入书籍ID的位置(比如URL路径、请求体参数),使用变量${bookIds_${__counter(TRUE,)}}:
__counter(TRUE,)会在每次循环时生成递增的数字(1、2、3),和bookIds_拼接后就能依次取出WS1、WS2、WS3。
Postman实现方案
1. 在请求Tests脚本中提取并存储ID列表
在返回目标JSON的请求的Tests标签中,编写以下脚本:
// 解析响应数据 const responseData = pm.response.json(); // 提取所有书籍ID到数组 const bookIds = responseData[0].books.map(item => item.id); // 将数组转成字符串存入环境变量(Postman无法直接存数组) pm.environment.set("bookIds", JSON.stringify(bookIds)); // 初始化计数器,记录当前使用的ID索引 pm.environment.set("currentIdIndex", 0);
2. 在目标HTTP请求的前置脚本中获取当前ID
在需要传入书籍ID的每个HTTP请求的Pre-request Script标签中,添加以下脚本:
// 从环境变量取出ID数组并解析 const bookIds = JSON.parse(pm.environment.get("bookIds")); const currentIndex = parseInt(pm.environment.get("currentIdIndex")); // 获取当前要使用的书籍ID const currentBookId = bookIds[currentIndex]; // 将ID设置为临时变量供请求使用 pm.variables.set("currentBookId", currentBookId); // 递增计数器,确保下一个请求使用下一个ID pm.environment.set("currentIdIndex", currentIndex + 1);
3. 在请求中引用ID
在请求的参数、路径或请求体中,用{{currentBookId}}引用当前书籍ID即可。
内容的提问来源于stack exchange,提问作者Vivek Kanna

