MeterSphere BeanShell 前置脚本拦截请求,获取请求参数,修改后放回请求体

BeanShell 前置脚本中拦截请求,获取请求参数,修改后放回请求体

背景

在测试项目时,需要对接口请求中的参数值进行首字母排序后,拼成字符串,进行md5加密,然后将加密好的字符串,存到请求体中。

想法

  1. 首先想到的是在前置处理中使用 python 对参数进行加密,传回 body

    已实现,但是请求参数需要写在前置处理器中。不方便,MeterSphere 当前的 2.4.0 版本中只支持 Python2 , 参数中如果中有中文,会出现难处理的编码问题,后面逐渐放弃在前置脚本中使用 Python

  2. 这个场景就需要在前置处理器中使用 beanshell 进行请求拦截,对参数进行加密修改后,塞回请求体中,想到可以使用 Sample 类处理,故转变方向,使用 Java 来处理。下文中使用的为 Java 处理的记录。

记录

  1. 使用 idea 新建 maven ,编写工具类后验证通过进行打包。

    <dependencies>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>2.0.19</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core -->
            <dependency>
                <groupId>org.apache.jmeter</groupId>
                <artifactId>ApacheJMeter_core</artifactId>
                <version>5.5</version>
            </dependency>
        </dependencies>
    
    package org.example;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.math.BigInteger;
    import java.util.*;
    import java.util.stream.Collectors;
    
    public class MD5Util {
    
    
        public static HashMap mapStringToMap(String str, String app_key) {
       
            // 自定义业务逻辑
            return new HashMap();
        }
    	// main 貌似为必须的
        public static void main(String[] args) {
            
        }
    
    }
    
    
    
    
    
  2. 打包后上传jar包到项目的文件夹中

  3. beanshell 中使用,注意自定义的jar包,import pagename.类名

    import org.example.MD5Util;
    import org.apache.jmeter.protocol.http.control.HeaderManager;
    import org.apache.jmeter.protocol.http.control.Header;
    import org.apache.jmeter.protocol.http.util.HTTPArgument;
    import org.apache.jmeter.config.*;
    import org.apache.commons.codec.digest.DigestUtils;
    import java.io.UnsupportedEncodingException;
    import org.json.*;
    import java.util.*;
    
    HeaderManager headerManager = sampler.getHeaderManager();
    Map headerMap = new HashMap();
     
    //获取请求参数
    Arguments args = sampler.getArguments();
    log.info(args.getClass().toString());
    log.info(args.toString());
    int n = args.getArgumentCount();
    //参数存入map中
    Map params = new HashMap();
    
    for(int x=0;x<n;x++){
        params.put(args.getArgument(x).getName(),args.getArgument(x).getValue());
    }
    paramsObj = params.get("");
    log.info(paramsObj.getClass().toString());
    log.info(paramsObj.toString());
    
    signStr = MD5Util.mapStringToMap(paramsObj,"${app_key}");
    log.info(signStr.getClass().toString());
    log.info(signStr.toString());
    vars.put(${__metersphere_env_id}+"sign","${signStr}");
    vars.put("sign",signStr)
    

最终在 body 中数据被转义,没有请求成功,最后一步待研究被转义的原因的原因,因为请求头信息中包含:application:json,应该是不会被转义的。

网上也没有找到合适的帖子。这个想法应该是可以成功的。如果可以成功,请留言。

参考:

MetersPhere参数赋值时间戳+对接口参数进行加密---form-data格式请求

posted @ 2022-12-05 10:59  Evies  阅读(2338)  评论(0编辑  收藏  举报