Jmeter 实现自动从请求中获取参数,并签名

  在使用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);

 

    

posted @ 2020-06-16 15:06  烟七七  阅读(4625)  评论(1编辑  收藏  举报