我在发送带有包含空格的值的参数的HTTP POST请求时遇到问题。 JMeter取代了每一个" "和"%20"使用" +"。
它似乎与HTTP实现有关,因为只有在使用HttpClient3.1和HttpClient4时才会发生。 Java实现发送编码和解码的空格。至少根据结果树监听器。
我需要能够使用HttpClient4,因为它似乎是唯一可以让NTLM授权工作的人。任何有关寻找解决方案的指示都表示赞赏。
更新:在Richard Friedman的帮助下找到了发送空白的方法。我最终编辑了负责调用编码的HTTPHC4Impl.java源代码。
while (args.hasNext()) {
HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
// The HTTPClient always urlencodes both name and value,
// so if the argument is already encoded, we have to decode
// it before adding it to the post request
String parameterName = arg.getName();
if (arg.isSkippable(parameterName)){
continue;
}
String parameterValue = arg.getValue();
if(!arg.isAlwaysEncoded()) {
// The value is already encoded by the user
// Must decode the value now, so that when the
// httpclient encodes it, we end up with the same value
// as the user had entered.
parameterName = parameterName.replaceAll("\\+", "__tempplus__");
parameterValue = parameterValue.replaceAll("\\+", "__tempplus__");
parameterName = URLDecoder.decode(parameterName, urlContentEncoding);
parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding);
}
// Add the parameter, httpclient will urlencode it
nvps.add(new BasicNameValuePair(parameterName, parameterValue));
}
//UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nvps, urlContentEncoding);
StringBuilder asdf = new StringBuilder();
for (NameValuePair pair : nvps) {
String name = URLEncoder.encode(pair.getName(), urlContentEncoding);
name = name.replaceAll("\\+", "%20");
name = name.replaceAll("__tempplus__", "%2B");
String value = URLEncoder.encode(pair.getValue(), urlContentEncoding);
value = value.replaceAll("\\+", "%20");
value = value.replaceAll("__tempplus__", "%2B");
asdf.append(name);
asdf.append("=");
asdf.append(value);
asdf.append("&");
}
asdf.deleteCharAt(asdf.length()-1);
StringEntity entity = new StringEntity(asdf.toString(), urlContentEncoding);
post.setEntity(entity);
虽然这很快而且很脏,但它确实完成了任务。基本上,加号在解码之前被替换为临时值,以免被误认为是空格。然后编码加号后转换为%20,临时加号编码为%2B。
答案 0 :(得分:0)
我在样本测试中看到了相同的行为。如果你想控制它们是否被编码并仍然使用HTTPClient,你必须检查 - '使用multipart / form-data进行POST'。
在POST期间使用Java实现,您可以控制参数是否已编码。但是,HTTPClient将始终为不是多部分的POST编码参数。
HTTPHC4Impl.java的源代码对此进行了解释,它是HTTP请求HTTPClient4的采样器。
while (args.hasNext()) {
HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
// The HTTPClient always urlencodes both name and value,
// so if the argument is already encoded, we have to decode
// it before adding it to the post request
String parameterName = arg.getName();
if (arg.isSkippable(parameterName)){
continue;
}
String parameterValue = arg.getValue();
if(!arg.isAlwaysEncoded()) {
// The value is already encoded by the user
// Must decode the value now, so that when the
// httpclient encodes it, we end up with the same value
// as the user had entered.
parameterName = URLDecoder.decode(parameterName, urlContentEncoding);
parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding);
}
// Add the parameter, httpclient will urlencode it
nvps.add(new BasicNameValuePair(parameterName, parameterValue));
}
您可以从此负载测试中获取JMX File。
如果您通过正文数据传递数据,则可以控制内容并导致数据不被编码。
以下是已更新的JMX File and Test Results
您可以查看结果树,看它在没有编码的情况下传递数据。