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)

作者:ABEELAN

出处:https://www.cnblogs.com/abeelan/p/17268989.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   ABEELAN  阅读(845)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示