JMETER引用自定义的JAR文件方法解决发送请求的URL参数转码问题

问题背景

通常在一个项目中,进行列表的数据查询时,都会发送GET的请求方式,在URL都带有查询条件的参数,而这些参数通常会被转码后才发送到服务器。在进行接口测试的时候往往会对请求参数进行参数化,而转码会带来参数化的复杂性,非常麻烦。

例如:

转码后发送到服务器的URL请求:http://tool.chinaz.com/login?%2flogin%3fusername%3dadmin%26password%3dadmin

解码后还原的URL请求:http://tool.chinaz.com/login?username=admin&password=admin

 

解决方法

1.为了解决URL的转码问题,在发送URL请求时,使用fiddler进行抓取发送的URL参数进行解码还原后,再进行拼接请求参数。

2.将拼接好的URL请求使用JAVA编写的代码进行转码,以JAVA文件的方式导出,提供给JMETER进行方法调用。

3.为Http Request添加JSR223 PreProcessor组件,该组件是在Http 请求之前调用JAR文件的JAVA代码的方法对参数进行转码处理。

3.将转码好的数据进行参数化提供jmeter引用。

 

解决步骤

转码和解码的JAVA源代码

package evmsc2.com;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class UrlCoder {

    public String urlDecoder(String decodeUrlParm) {

        String decoderStr = null;
        try {
            decoderStr = URLDecoder.decode(decodeUrlParm, "utf-8");
            System.out.println("解码:" + decoderStr);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return decoderStr;
    }

    public String urlEncoder(String encodeUrlParm) {
        String encodeStr = null;
        try {
            encodeStr = URLEncoder.encode(encodeUrlParm, "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("编码:" + encodeStr);
        return encodeStr;
    }

}

JMETER引用转码和解码的JAR文件

将该文件的代码以JAR文件的格式进行导出后,放在JMETER目录的/lib/ext目录下

在测试计划中的Library以相对路径的方式引用JAR文件。

JSR223 PreProcessor组件中调用JAR文件的转发方法

调用方法代码如下:

import evmsc2.com.UrlCoder;
import evmsc2.com.DateTimeTool; 
String beginTime = vars.get("last_upload_time");
String vin = vars.get("vin");
String begin = new DateTimeTool().getSpecialDayAddOrBefore(beginTime,-5,0,1,1);
String end = new DateTimeTool().getSpecialDayAddOrBefore(beginTime,0,0,1,1);
String str = "{\"conditions\":[{\"name\":\"beginTime\",\"value\":\"" + begin + "\"},"
                + "{\"name\":\"endTime\",\"value\":\"" + end + "\"},{\"name\":\"vin\",\"value\":\"" + vin + "\"}],"
                + "\"sort\":[],\"start\":0,\"limit\":10}";
String url = new UrlCoder().urlEncoder(str);
log.info(url);
vars.put("parameter",url);
 

调用之前需要进行导入包和类,跟java的风格一样。str参数就是发送URL请求的参数,所以需要str进行转码。

String url = new UrlCoder().urlEncoder(str);该行代码进行调用JAVA的方法进行转码,返回转码后的数据。

vars.put("parameter",url);该行代码进行将转码后的数据封装在一个变量中,提供jmeter进行使用,以${变量名}的方式获取值。

获取转码后的变量发送转码后的URL请求

根据JMETER获取变量值的方式${parameter},获得值后,发送请求。

在JMETER的View Reesults Tree中可以查看到发送求前参数被转码,完美解决该问题。

注意:如果对本博文有疑问或者有错误的地方可留言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值