• 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);

        

  • 相关阅读:
    《HeadFirst设计模式》第三章-装饰者模式-读书笔记
    《HeadFirst设计模式》第五章单件模式-读书笔记
    《HeadFirst设计模式》第六章命令模式-读书笔记
    《HeadFirst设计模式》第二章观察者模式-读书笔记
    《HeadFirst设计模式》第一章策略模式-读书笔记
    python学习目录
    使用socket实现的ftp文件传输服务器
    selenium之 驱动环境配置chrome、firefox、IE
    selenium获取动态网页信息(某东)-具体配置信息
    9.Redis Cluster初识
  • 原文地址:https://www.cnblogs.com/Yanqiqi/p/13141028.html
Copyright © 2020-2023  润新知