1. 程式人生 > 其它 >MeterSphere BeanShell 前置指令碼攔截請求,獲取請求引數,修改後放回請求體

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格式請求