jmeter 如何在请求之前修改 post body 里面的某个参数的值?
{
"s_id":"2027",
"pme":"aaatest",
"ct_id":"testaaa001",
"ct_desc":"desc",
"sign":"请求之前修改这个值"
}
我也是这么做的,不行
我的过程是:
1.先通过 Arguments args = sampler.getArguments() 取到 body 相关参数用来加签。
2.再将签值替换到 ${sign}里面
发现最后还是 ${sign},没替换。这一步很困惑,是不是存在什么顺序。
明确 sign 参数值的来源,是其他接口获取,还是随机的又或者是固定的几个参数,不同来源参数化方式不同
Arguments args = sampler.getArguments() 获取的是请求的 body 内容,对于参数化没有作用
你这里只需要参数化 sign 就可以了,方便的话把脚本贴出来看下
确实是 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
你知道 beanshell 里面怎么把 http request 里面的 Body Data 那一串 json 获取到吗 这个我找好久没找到
这个问题有点奇怪
http request 的数据,本身就是参数,要么是需要在请求的时候参数化,要么就是引用之前请求的返回值
不管怎么样都会有数据来源,属于已知的数据,为什么要去通过请求的 json 串获取而不直接引用对应的值?
都聊到前置处理器了,不顺便看看后置处理器么?
是奇怪的问题啊,比较少看到,不然我都不会在这问了 ,但是同样的需求,我在 postman 里面实现了,所以就不知道 jmeter 里面怎么做,仅此而已,单纯想知道这个怎么实现
--之前你讲的都对,都是一般常规的操作吧,一般没问题都会的
你可能没明白我的意思,非要这么做也不是不行
Arguments args = sampler.getArguments() 获取请求的 body 内容后,再使用 json 解析就可以
关键点是,你明知道参数就是 1 为什么非要山路 18 弯的去取值 而不是直接写 1
或者说是因为习惯了 postman 这样实现的思维定势?
这个问题我也遇到了,beanshell 中我用 vars 局部变量赋值后,在 json 请求 body 中参数化死活获取不到该变量。后来我试了全局变量赋值,可以是可以拿到,但全局变量也有坑。
可以 argument.setValue() 替换整个 body 内容