在使用BeanShell 处理程序进行签名时,总是需要手动配置待签名的参数字段。
在新增接口,以及进行接口功能、逻辑、异常、安全、并发等场景测试时,由于需要调整参数,导致每次都需要重新配置BeanShell脚本。有时总会出现签名失败错误。极其心累。
也想过通过CVS文件,将参数参数化来实现,但在使用过程中,遇到以下几个问题:
1,同一个接口情况下,使用同一个CVS,还能实现参数化,但接口数量比较多时,不同参数的数量大于50个以后,维护起来非常困难。
2,接口有修改时,需要同时更新CVS配置和接口,太累了。
所以,上网找啊找,自动实现从请求中获取参数,并自动排序,拼接,生成要签名的字符串,在自动签名。这样,不管接口、参数怎么变化,签名的脚本都不需要改变,可以通用。
使用JSR233脚本来实现:也可以用BeanShell脚本。
思路:
首先从请求中获取参数:
GET:---暂时还没找到办法,欢迎大家提供意见。 ^_^
POST:
将参数按Key排序并拼接成要签名的字符串
将字符串,拼接上掩码。
调用签名的方法。生成签名后的字符串。
将签名后的字符串设置为http头参数。
1,首先从请求中获取参数:
//获取请求的body参数 Arguments args = sampler.getArguments(); //将获取到的参数转换成字符串格式 String json = args.getArgument(0).getValue(); //注意:getArgument(0)中的0,一般获取到的请求参数中只有第0个数据。 //在获取返回值时,才会有多个数据列
log.info(">>>>>>>>>>>{}", json);
//输出值为:>>>>>>>>>>>{"userId":"123456","userType":"123","type":"1"}
//红色部分为实际值
2,将参数按Key排序并拼接成要签名的字符串
//将获取到的json串 通过 JSONObject 转换成map Map map = JSONObject.parseObject(json, Map.class); StringBuffer sb = new StringBuffer(); //获取map中key的set集合 Set<String> set = map.keySet(); //将set集合转换成数组 Object[] arr = set.toArray(); //排序 Arrays.sort(arr); //拼接字段 for (Object key : arr) { String value = null == map.get(key) ? "" : map.get(key).toString(); sb.append(key + "=" + value); // 最终字段类似:type=1userId=123456userType=123 }
3,将字符串,拼接上掩码。
//拼接掩码 String signString = "掩码"+sb.toString();
4,调用签名方法,生成签名字段
//调用签名方法,生成签名后的字符串 String sign = new Openapi2sign().md5Encode(signString);
log.info("sign------------->{}",sign);
5,将签名的字段设置为Http签名参数
//将签名后的字符串设置为http头签名参数 vars.put("sign",signStr);
最后,附上完整代码:
其中XXXXsign签名包请找开发获取。 fastjson.jar 包可以在网络上获取。一般下载Maven,中都会有这个包。
import java.util.Map; import org.apache.jmeter.config.Arguments; import com.alibaba.fastjson.JSONObject; import XXXXsign; //获取请求的body参数 Arguments args = sampler.getArguments(); //将获取到的参数转换成字符串格式 String json = args.getArgument(0).getValue(); //注意:getArgument(0)中的0,一般获取到的请求参数中只有第0个数据。 //在获取返回值时,才会有多个数据列 log.info(">>>>>>>>>>>{}", json); //输出值为:>>>>>>>>>>>{"userId":"123456","userType":"123","type":"1"} //红色部分为实际值 //将获取到的json串 通过 JSONObject 转换成map Map map = JSONObject.parseObject(json, Map.class); StringBuffer sb = new StringBuffer(); //获取map中key的set集合 Set<String> set = map.keySet(); //将set集合转换成数组 Object[] arr = set.toArray(); //排序 Arrays.sort(arr); //拼接字段 for (Object key : arr) { String value = null == map.get(key) ? "" : map.get(key).toString(); sb.append(key + "=" + value); // 最终字段类似:type=1userId=123456userType=123 } //拼接掩码 String signString = "掩码"+sb.toString(); //调用签名方法,生成签名后的字符串 String sign = new XXXXsign().md5Encode(signString); log.info("sign------------->{}",sign); //将签名后的字符串设置为http头签名参数 vars.put("sign",sign);