在使用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);