前言
接口請求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值
響應結果是成功的