Loading

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,导致请求出错。
image

后来在 jmeter 官方找到 addNonEncodedArgument 函数,问题解决,已更新到上面的脚本中。

参考:https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.html#addNonEncodedArgument(java.lang.String,java.lang.String,java.lang.String)

posted @ 2023-03-29 15:00  ABEELAN  阅读(758)  评论(0编辑  收藏  举报