**场景:在Jmeter工具中调用java脚本进行接口测试,在在线协商过程中出现一个偶发性的问题,时而接口调用成功,时而接口调用失败(在入参不变的情况下),后来进行分析,发现这个由于使用HttpClient存在的一个弊端,使用参数化形式进行传参的时候,如果参数中含有“+”时被当成空格进行,导致传参错误,从而接口调用失败。
**
例:https://localhost:8890/login?userName="admin"&password="adsdwejhibhbvwqw=scdx+156asas"
方法一(基于HttpClient):针对这种情况,手动将“+”修改为“%2B”后进行传参,或者编写一个函数进行处理https://localhost:8890/login?userName="admin"&password="adsdwejhibhbvwqwscdx%2B156asas";
此时后端使用web框架取参数,通常会自动进行URLdecode操作,不需要显示的去解码。
常见的特殊字符对应的URL编码如下:
方法二(推荐):这个问题是http/https协议参数化不支持“+”,后来考虑编写一段函数进行处理这种偶发性问题,但并没有这么做,因为发现基于HttpClientUtils进行Http/Https协议请求的封装不仅可以解决这个问题,还有效的进行传参(主要函数)。
private static String buildUrl(Map<String,String> map){
if(MapUtils.isEmpty(map)){
return "";
}
StringBuilder stringBuffer = new StringBuilder();
stringBuffer.append('?');
for(Map.Entry<String,String> stringStringEntry : map.entrySet()){
stringBuffer.append(stringStringEntry.getKey()).append('=').append(stringStringEntry.getValue()).append('&');
}
String result = stringBuffer.toString();
//去掉结尾的连接符
if (!StringUtils.isEmpty(result)){
result = result.substring(0,result.length()-1);
}
return result;
}
详细的HttpClientUtils见: