使用JMeter在HTTP POST中发送转义的空格

时间:2015-02-12 19:31:25

标签: http-post jmeter whitespace

我在发送带有包含空格的值的参数的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。

1 个答案:

答案 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

  • 一个带参数的HTTP请求,显示问题
  • 使用Body Data的第二个请求

您可以查看结果树,看它在没有编码的情况下传递数据。 enter image description here