先上代码
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.Header;
import java.util.*;
import com.google.gson.Gson;
import GenerateSign;
import org.apache.jmeter.protocol.http.util.HTTPArgument;
GenerateSign mysign = new GenerateSign();
HeaderManager headerManager = sampler.getHeaderManager();
Map headerMap = new HashMap();
if(headerManager != null){
for(int i=0;i<headerManager.size();i++){
Header header = headerManager.get(i);
headerMap.put(header.getName(),header.getValue());
}
}
//获取ua
String ua = headerMap.get("User-Agent");
//获取请求路径
String path = sampler.getUrl().getPath();
//获取域名
String Host = sampler.getUrl().getHost();
//获取协议
String protocol = sampler.getUrl().getProtocol();
//拼接URL
String requestUrl = protocol + "//" + Host + path;
//获取query部分
String requestQuery = sampler.getUrl().getQuery();
//获取请求方法返回值为大写GET
String method = sampler.getMethod();
Arguments args = sampler.getArguments();
//获取请求参数
int n = args.getArgumentCount();
//参数存入map中
Map params = new HashMap();
if(method.equals("POST")){
params = mysign.generate_map(requestQuery);
}else{
//获取参数名
//log.info(args.getArgument(0).getName());
//获取参数值
//log.info(args.getArgument(0).getValue());
for(int x=0;x<n;x++){
params.put(args.getArgument(x).getName(),args.getArgument(x).getValue());
}
}
String gatesign = mysign.getSign(params,ua,requestUrl);
String gatets = mysign.getTime();
// 添加请求参数,不会添加到query中去
//args.addArgument(new HTTPArgument("gatesign",gatesign));
//args.addArgument(new HTTPArgument("gatets",gatets));
// 把验签参数加到query中去
String path_send = sampler.getPath()+"&gatesign="+gatesign+"&gatets="+gatets;
// 重新设置path
sampler.setPath(path_send);
api参考地址
https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.html
https://jmeter.apache.org/api/org/apache/jmeter/config/Arguments.html //参数相关方法
https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/control/Header.html
https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/control/HeaderManager.html#getHeader-int- //所有获取header的方法
https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/sampler/HTTPSamplerProxy.html#HTTPSamplerProxy-- //里面有sample的所有方法
说一说坑
1.beanshell里面使用map时不能指定类似于java的Map<String,String> map = new HashMap<String,String>(),这样写会报错,只能用Map params = new HashMap();这种方式
2.HeaderManager headerManager = sampler.getHeaderManager();这个方法不能获取默认的header,只能获取自己添加的header信息,比如自己再header里面加的token信息,默认的header信息,例如User-Agent是获取不到的,在获取headers之前一定要先判断一下header列表是否为空,如果不为空直接获取会报错
3.log.info()接收的参数只能是字符串,其他类型会报错
4.里面的字符串必须要用双引号括起来,单引号不行
介绍一些内置其他的函数
vars:可以操作变量,例如,vars.get(“token”),获取jmeter变量名为token的值,注意要用英文双引号,vars.put(key,value),设置系统变量
prev:获取当前请求的结果prev.get()
props:获取jmeter属性,生成/更新/获取当前脚本的jmeter属性,props.get(key) props.put(key,value)
ctx:获取当前线程的上下文,例子如下
import org.apache.jmeter.samples.SampleResult
SampleResult result = ctx.getPreviousResult();