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

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM