MeterSphere beanshell - 修改请求体中的数据
metersphere 接口平台
需求:设置请求前置脚本,修改 「请求体」 内容,然后用更新后的请求体发起请求。
调试如下接口:
接口:https://httpbin.org/post
方法:post
请求体:
{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
}
将 address 的值,修改为字符串,其他字段保持不变。
实现
新增 beanshell 脚本
import org.json.JSONObject;
log.info("Output >>>>>");
// 获取请求体内容,数组的第一个元素就是请求体
String request = sampler.getArguments().getArgument(0).getValue();
log.info("Output >>>>> requests body type: " + request.getClass().getName());
// 将请求体转为 json 对象
JSONObject json = new JSONObject(request);
log.info("Output >>>>> 初始请求体: {}", json);
// 提取 json 内的字段值
JSONObject data = json.getJSONObject("address");
log.info("Output >>>>> address: {}", data);
// 将 address 的 json 对象转为字符串
String dataString = data.toString();
// 重新填充到请求体内
json.put("address", dataString);
String updatedRequest = json.toString();
log.info("Output >>>>> requests body type(update): " + updatedRequest.getClass().getName());
// 重新添加更新后的请求体
sampler.getArguments().removeAllArguments();
// sampler.addArgument("updateRequest", updatedRequest); # 会自动 urlencode,导致编码问题
sampler.addNonEncodedArgument("", updatedRequest, "");
// 打印当前的请求体
String request = sampler.getArguments().getArgument(0).getValue();
log.info("Output >>>>> 最终请求体: {}", request);
遇到的问题
调用该前置脚本后,控制台输出的请求体是正常编码,但是在请求内容中,请求体的编码格式为 urlencode,导致请求出错。
后来在 jmeter 官方找到 addNonEncodedArgument
函数,问题解决,已更新到上面的脚本中。