MeterSphere BeanShell 前置指令碼攔截請求,獲取請求引數,修改後放回請求體
阿新 • • 發佈:2022-12-05
在 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
,應該是不會被轉義的。
網上也沒有找到合適的帖子。這個想法應該是可以成功的。如果可以成功,請留言。
參考: