MeterSphere BeanShell 前置脚本拦截请求,获取请求参数,修改后放回请求体
在 BeanShell
前置脚本中拦截请求,获取请求参数,修改后放回请求体
背景
在测试项目时,需要对接口请求中的参数值进行首字母排序后,拼成字符串,进行md5加密,然后将加密好的字符串,存到请求体中。
想法
-
首先想到的是在前置处理中使用
python
对参数进行加密,传回body
。已实现,但是请求参数需要写在前置处理器中。不方便,
MeterSphere
当前的2.4.0
版本中只支持Python2
, 参数中如果中有中文,会出现难处理的编码问题,后面逐渐放弃在前置脚本中使用Python
。 -
这个场景就需要在前置处理器中使用
beanshell
进行请求拦截,对参数进行加密修改后,塞回请求体中,想到可以使用Sample
类处理,故转变方向,使用Java
来处理。下文中使用的为Java
处理的记录。
记录
-
使用 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) { } }
-
打包后上传jar包到项目的文件夹中
-
在
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
,应该是不会被转义的。
网上也没有找到合适的帖子。这个想法应该是可以成功的。如果可以成功,请留言。
参考: