如何在JMeter中基于前序API响应构造动态接口请求
动态填充sourceFilterInfo参数实现方案
核心逻辑是先遍历所有提取到的source、sourceUserId参数对,按要求组装成数组结构,再代入后续请求体即可,完全适配参数个数动态变化的场景:
通用逻辑
不管你用什么工具/语言实现,都可以按以下步骤处理:
- 先确认你用正则提取到的多组参数存储规则,一般工具会自动按
参数名_序号的格式存储多匹配结果,同时返回匹配总个数 - 循环遍历所有匹配项,每次取同一序号的
source和sourceUserId拼成符合要求的对象 - 把所有对象存入数组后转成JSON字符串,存为公共变量
- 后续请求体的
sourceFilterInfo字段直接引用该公共变量即可
常用工具/场景实现示例
Postman场景
如果没用正则提取,可直接在前序请求的Tests标签里处理响应,比正则提取更稳定:
const resp = pm.response.json(); // 自动遍历响应组装数组 const sourceFilterInfo = resp.map(item => ({ source: item.userSourceMeta.source, sourceUserId: item.userSourceMeta.sourceUserId })); // 存为环境变量 pm.environment.set("sourceFilterInfo", JSON.stringify(sourceFilterInfo));
后续请求体直接引用变量:
{ "Answer": "My name is xyz", "queryChannel": "WEB_APP", "timeZone": "Asia/Calcutta", "sourceFilterInfo": {{sourceFilterInfo}}, "contextIds": [] }
Jmeter场景
你已经用正则提取到参数的话,直接用BeanShell后置处理程序组装即可:
// 拿到正则匹配到的参数总个数 int matchCount = Integer.parseInt(vars.get("source_matchNr")); JSONArray filterArr = new JSONArray(); for(int i = 1; i <= matchCount; i++){ JSONObject item = new JSONObject(); // 按序号取同一组的两个参数 item.put("source", vars.get("source_" + i)); item.put("sourceUserId", vars.get("sourceUserId_" + i)); filterArr.put(item); } // 存为变量 vars.put("sourceFilterInfo", filterArr.toString());
后续请求体直接引用${sourceFilterInfo}变量即可。
Python代码场景
import requests, json # 前序接口请求 pre_resp = requests.get("前序接口地址").json() # 组装参数 source_filter_info = [ {"source": item["userSourceMeta"]["source"], "sourceUserId": item["userSourceMeta"]["sourceUserId"]} for item in pre_resp ] # 构造后续请求体 payload = { "Answer": "My name is xyz", "queryChannel": "WEB_APP", "timeZone": "Asia/Calcutta", "sourceFilterInfo": source_filter_info, "contextIds": [] } # 发后续请求 requests.post("后续接口地址", json=payload)
内容的提问来源于stack exchange,提问作者Shankar Daitha
相关产品推荐
相关产品推荐

