MS - 提取多个变量为列表,作为下个接口的传参

发布时间 2023-04-11 14:06:28作者: ABEELAN

接口获取信息,提取多个值存储到列表,用于下一个接口的传参。

接口一

获取所有问卷的信息列表:

{
    "success": true,
    "message": "success",
    "data": [
        {
            "id": 7711,
            "name": "员工福利需求调查 - 1"
        },
        {
            "id": 7712,
            "name": "员工福利需求调查 - 2"
        },
        {
            "id": 7713,
            "name": "员工福利需求调查 - 3"
        }
    ]
}

通过「 后置操作 - 提取参数 - JsonPath提取 」,表达式为:$.data[*].id 获取所有 ID 并赋值给变量 form_ids,注意要勾选后面的「 匹配多条 」。

接口二

删除所有的表单 /delete,请求体如下:

{
    "companyId": "996",
    "formId": []  // 接收一个表单 ID 列表,用于删除组内所有表单
}

上面已经提取出来所有表单 ID 并赋值给变量了,这里直接通过控制台打印变量看下

log.info(vars.get("form_ids"));  // 报错;获取不到变量
ERROR

// 由于勾选了匹配多个,提取全部变量需要添加后缀 **_ALL
log.info(vars.get("form_ids_ALL"));
7711,7712,7713

由于请求体内需要的类型是数组,所以在传参的时候手动加上中括号,请求体如下:

{
    "companyId": "996",
    "formId": "[${form_ids_ALL}]"
}

发送请求,发现请求体中的 formId 其实是个字符串,并不是列表类型的

"formId": "[7711,7712,7713]"

添加前置脚本,去掉请求体中该参数值的两个引号

log.info("====== 去掉 formId 参数值前后的引号 ======");

String requestBody = sampler.getArguments().getArgument(0).getValue();
log.info("初始请求体: \n{}", requestBody);

requestBody = requestBody.replace("\"[", "[").replace("]\"", "]");
log.info("更新请求体: \n{}", requestBody);

sampler.getArguments().removeAllArguments();
sampler.addNonEncodedArgument("", requestBody, "");
sampler.setPostBodyRaw(true);

log.info("====== 去掉 formId 参数值前后的引号 ======");

发送请求,formId 已经变成列表类型了,请求成功,返回正确的业务状态。

"formId": [7711,7712,7713]

问题解决!

感觉有点复杂呀,要是有更好的办法请告诉我!?