前言接口请求body带有sign签名参数,sign签名是根据请求body除去sign本身参数后,拼接请求参数最后md5加密生成的。 使用 jmeter 测试接口,我们希望在请求之前修改 post body 里面的 sign 参数的值为签名的值。 sign签名签名一篇的实现方式是添加 BeanShell 预处理程序,生成sign值,设置一个变量,然后在请求的body里面引用变量。 可以参考前面这篇https://www.cnblogs.com/yoyoketang/p/14229289.html 接下来再讲另外一种实现方式,在BeanShell 预处理程序先获取请求的body,签名后给sign参数重新赋值,然后发送新的请求body,整体实现思路如下 1.先获取请求body值 2.body转JSONObject对象 3.根据sign签名规则,对JSONObject对象遍历取值,然后排序 4.排序后拼接签名key,生成一个新的字符串 5.md5加密,得到sign签名值 6.给jsonObject对象添加sign属性 7.JSONObject 转json字符串 8.给请求的body重新赋值 在发送请求之前添加上面功能的预处理,就可以实现body参数自动签名了 BeanShell 预处理程序HTTP请求样本在body里面可以不用加签名sign参数 添加 BeanShell 预处理程序 整体代码实现如下 import org.apache.jmeter.config.Arguments; import org.apache.jmeter.config.Argument; import org.json.JSONObject; import org.json.JSONArray; import org.apache.commons.codec.digest.DigestUtils; //导入md5加密的包 // 作者-上海悠悠 QQ交流群:717225969 // blog地址 https://www.cnblogs.com/yoyoketang/
Arguments arguments = sampler.getArguments(); Argument arg = arguments.getArgument(0); // 1.获取请求body值 String body = arg.getValue(); log.info(body);
// 2.body转json对象 JSONObject jsonObject = new JSONObject(body); String user = jsonObject.getString("username"); String psw = jsonObject.getString("password"); log.info(user);
//3.获取到的json对象去除sign本身参数,拼接参数,排序,拼接key // 这段暂时还不会用java代码全自动实现 String a = "username" + user; log.info(a); String b = "password" + psw; log.info(b); String key = "12345678"; log.info(key);
// 4.排序后拼接签名key字符串 c = b+a+key; log.info(c);
// 5.md5加密,得到sign签名值 String md5_after = DigestUtils.md5Hex(c); // md5加密 log.info(md5_after);
// 6.给jsonObject对象添加sign参数 jsonObject.put("sign", md5_after);
// 7.JSONObject 转字符串 String postData = jsonObject.toString(); log.info(postData);
// 8.重新赋值请求的body参数 arg.setValue(postData); 运行后的部分日志 2021-01-04 22:31:15,783 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1 2021-01-04 22:31:15,786 INFO o.a.j.u.BeanShellTestElement: {"username": "test", "password": "123456", "mail": ""} 2021-01-04 22:31:15,788 INFO o.a.j.u.BeanShellTestElement: test 2021-01-04 22:31:15,788 INFO o.a.j.u.BeanShellTestElement: usernametest 2021-01-04 22:31:15,788 INFO o.a.j.u.BeanShellTestElement: password123456 2021-01-04 22:31:15,789 INFO o.a.j.u.BeanShellTestElement: 12345678 2021-01-04 22:31:15,790 INFO o.a.j.u.BeanShellTestElement: password123456usernametest12345678 2021-01-04 22:31:15,791 INFO o.a.j.u.BeanShellTestElement: 1aca01806e93bb408041965a817666af 2021-01-04 22:31:15,791 INFO o.a.j.u.BeanShellTestElement: {"password":"123456","mail":"","sign":"1aca01806e93bb408041965a817666af","username":"test"} 2021-01-04 22:31:15,929 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1 查看结果树查看结果树运行结果请求body会带上sign值 响应结果是成功的
2021年第六期《python接口自动化+测试开发》课程,1月9号开学(火热报名中!) 本期上课时间:1月9号-4月18号,每周六、周日晚上20:30-22:30
|