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

it2022-05-05  168

问题背景

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

例如:

转码后发送到服务器的URL请求:http://tool.chinaz.com/login?/login?username=admin&password=admin

解码后还原的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)