接口测试 jmeter 如何在请求之前修改 post body 里面的参数的值

唱跳rap篮球 · 2020年12月01日 · 最后由 迪文 回复于 2021年05月25日 · 5967 次阅读

jmeter 如何在请求之前修改 post body 里面的某个参数的值?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 13 条回复 时间 点赞

{
"s_id":"2027",
"pme":"aaatest",
"ct_id":"testaaa001",
"ct_desc":"desc",
"sign":"请求之前修改这个值"
}

前置处理器设置变量 body 参数化引用变量

Tester_谜城 回复

我也是这么做的,不行
我的过程是:
1.先通过 Arguments args = sampler.getArguments() 取到 body 相关参数用来加签。
2.再将签值替换到 ${sign}里面
发现最后还是 ${sign},没替换。这一步很困惑,是不是存在什么顺序。

明确 sign 参数值的来源,是其他接口获取,还是随机的又或者是固定的几个参数,不同来源参数化方式不同
Arguments args = sampler.getArguments() 获取的是请求的 body 内容,对于参数化没有作用
你这里只需要参数化 sign 就可以了,方便的话把脚本贴出来看下

Tester_谜城 回复

确实是 jmeter 的 Arguments args = sampler.getArguments() 获取的是请求的 body 内容不能再参数化了。有解决办法,把参数外提配置到 User Defined Variables,只是这个不是我想要的。【实在不会 jmeter 里面怎么处理了,后来我就去用 postman 了😂
后来我用 postman 解决了,代码:
// salt
postman.setGlobalVariable("salt","aaaaaaaaaaaa");
salt = postman.getGlobalVariable("salt");

// 解析 request.body,获取参数
var body = pm.request.body.raw;
var body_json = JSON.parse(body);

var s_id = body_json["s_id"];
var pme = body_json["pme"];
var ct_id = body_json["ct_id"];
var ct_desc = body_json["ct_desc"];
var a_list_obj = body_json["a_list"];
var a_list = JSON.stringify(a_list_obj);

//sign:进行 MD5 加密
var signToMd5 = 'a_list='+a_list+'&s_id='+s_id+'&ct_id='+ct_id+'&ct_desc='+ct_desc+'&pme='+pme+'&salt='+salt;
var sign = CryptoJS.MD5(signToMd5).toString();

console.log("sign = "+sign);
postman.setGlobalVariable('sign',sign);// 在 body 中使用{{sign}}接收

Jmeter 的前置处理器 beanshell 或者 JSR223 可以满足你的要求
替换对应的 MD5 加密与变量设置方法,业务逻辑转换成 java 的写法就 OK

Tester_谜城 回复

你知道 beanshell 里面怎么把 http request 里面的 Body Data 那一串 json 获取到吗😂 这个我找好久没找到

这个问题有点奇怪
http request 的数据,本身就是参数,要么是需要在请求的时候参数化,要么就是引用之前请求的返回值
不管怎么样都会有数据来源,属于已知的数据,为什么要去通过请求的 json 串获取而不直接引用对应的值?


都聊到前置处理器了,不顺便看看后置处理器么?

Tester_谜城 回复

是奇怪的问题啊,比较少看到,不然我都不会在这问了😳 ,但是同样的需求,我在 postman 里面实现了,所以就不知道 jmeter 里面怎么做,仅此而已,单纯想知道这个怎么实现
--之前你讲的都对,都是一般常规的操作吧,一般没问题都会的

你可能没明白我的意思,非要这么做也不是不行
Arguments args = sampler.getArguments() 获取请求的 body 内容后,再使用 json 解析就可以
关键点是,你明知道参数就是 1 为什么非要山路 18 弯的去取值 而不是直接写 1
或者说是因为习惯了 postman 这样实现的思维定势?

这个问题我也遇到了,beanshell 中我用 vars 局部变量赋值后,在 json 请求 body 中参数化死活获取不到该变量。后来我试了全局变量赋值,可以是可以拿到,但全局变量也有坑。

可以 argument.setValue() 替换整个 body 内容

唱跳rap篮球 关闭了讨论 10月09日 15:04
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册