beanshell内置方法获取header、url、参数等信息用于计算验签

先上代码

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 map = new HashMap(),这样写会报错,只能用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();

你可能感兴趣的:(jmeter,jmeter,beanshell)