目录
读响应头
使用beanshell获取
响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项:
import java.util.HashMap;
import java.util.Map;
//将字符串用换行符 截取为adc数组
String [] headersList = ResponseHeaders.split("\n");
Map headersMap = new HashMap(); //创建HashMap来从新组装headers
for(int i=1;i<headersList.length;i++){
String [] itemList=headersList[i].split(": "); // 将每一条Header项按冒号分割,注意是有空格的
headersMap.put((itemList[0]), itemList[1]); // 分键值放入HashMap
}
String contentType = headersMap.get("Content-Type"); // 提取相应项
log.info("响应Content-Type:" + contentType)
使用正则表达式
写请求头
-
重点:该方法必须是JMeter先添加一个请求头管理器(里面有没有值没关系),不然会报错;添加一次后,若不删除,后续的请求都会有带有添加的请求头,下文有删除方法
-
保存在csv的数据需以Json格式,同时需要进行转义 - 转义工具 ,如:
{\"workbench-authorization\":\"${admin_authorization}\"}
示例:
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.testelement.property.CollectionProperty;
import org.apache.jmeter.protocol.http.sampler;
import org.apache.jmeter.protocol.http.control.Header;
import org.json.JSONObject;
//sampler 里面有个getHeaderManager 可以获得请求头
HeaderManager hm =sampler.getHeaderManager();
//打印出header信息
CollectionProperty cp=hm.getHeaders();
//System.out.println(cp);
for(int i=0;i<cp.size();i++){
log.info("----------before-----------");
log.info(cp.get(i)+"");
}
//
//将header 转为jsonobject
String header = "{\"token\":\"${token}\"}";
JSONObject header_obj= new JSONObject(header);
Iterator it = header_obj.keys();
while(it.hasNext()){
// 获得key
String key = it.next();
String value = header_obj.getString(key);
// System.out.println("key: "+key+",value:"+value);
Header hd = new Header();
hd.setName(key);
hd.setValue(value);
//加入sample 中
hm.add(hd);
}
//打印出对应值
log.info("----------after-----------");
for(int i=0;i<cp.size();i++){
log.info(cp.get(i)+"");
}
添加请求头案例:
以下方法是实际执行接口自动化的一部分请求的处理 ,csv脚本header部分准备如下
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.Header;
import org.apache.jmeter.protocol.http.sampler;
import org.json.JSONObject;
//sampler 里面有个getHeaderManager 可以获得请求头
HeaderManager hm =sampler.getHeaderManager();
List CSVHeaderKey = new ArrayList();
//将header 转为jsonobject
String header = "${__eval(${__eval(${request_header})})}";
//log.info("前置2 - 添加请求头:CSV获取到要添加的请求头:"+header);
//CSV里面的request_header 不为空才添加
if (header != null && header.length() != 0)
{
JSONObject header_obj= new JSONObject(header);
Iterator it = header_obj.keys();
while(it.hasNext()){
//获得key
String key = it.next();
String value = header_obj.getString(key);
CSVHeaderKey.add(key); //把添加的放到一个list,在后置处理器删除
Header hd = new Header();
hd.setName(key);
hd.setValue(value);
//加入sample中
hm.add(hd);
}
}
//用于后置处理器删除添加的header
//因为添加的请求头会用到下一个请求,当重复添加,请求头里就有多个同样的请求头,所以需要删除每次添加的请求头
vars.put("HeaderKey", CSVHeaderKey.toString());
删除请求头
为什么要删除:因为JMeter里每次添加请求头都是追加,跑接口时请求会添加多次,所以发起请求后需要再后置beanshell里进行删除。
import org.apache.jmeter.protocol.http.control.HeaderManager;
//因为添加的请求头会用到下一个请求,当重复添加,请求头里就有多个同样的请求头,所以需要删除每次添加的请求头
HeaderManager hm =ctx.getCurrentSampler().getHeaderManager();
//由String类型的List转成List
String arr = vars.get("HeaderKey");
String substring = arr.substring(1, arr.length() - 1);
String [] split = substring.split(", ");
List strings = Arrays.asList(split);
for (String key : strings) {
hm.removeHeaderNamed(key);
// log.info("后置3 - 删除前置添加的请求头的KEY:"+key);
}
踩坑小记:
后置处理器不支持导入 sampler对象,但是可以直接在类里添加方法直接绕过,手动狗头。。。。。
如:ctx.getCurrentSampler() 是sampler类型,若想接收sampler类型而通过import org.apache.jmeter.protocol.http.sampler;
导入sampler类就GG
但是!!!sampler 里面有个getHeaderManager方法,所以!!!可以直接这么写。ctx.getCurrentSampler().getHeaderManager()
就可以直接获取请求头了。
参考api:
-
HeaderManager (Apache JMeter dist API) //所有获取header的方法
-
HTTPSamplerProxy (Apache JMeter dist API) //里面有sample的所有方法
文章参考:beanshell内置方法获取header、url、参数等信息用于计算验签_一支吾猪的博客-CSDN博客