У меня возникли проблемы с отправкой запроса HTTP POST с параметром, который имеет значение, которое содержит пробел. JMeter заменяет все «» и «% 20» на «+».Отправка экранированных пробелов в HTTP POST с помощью JMeter
Кажется, что это связано с реализацией HTTP, поскольку это происходит только при использовании HttpClient3.1 и HttpClient4. Реализация Java отправляет пробелы, закодированные и декодированные. По крайней мере, согласно слушателю дерева результатов.
Мне нужно иметь возможность использовать HttpClient4, однако, поскольку он кажется единственным, что я могу получить разрешение NTLM для работы. Приветствуются любые указатели на то, где искать решение.
Обновление: найден способ отправки пробелов при помощи Ричарда Фридмана. Я закончил редактирование исходного кода 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.
У вас есть опция «Использовать данные о multipart/form-data для POST»? Кажется, что он работает последовательно в реализациях HTTP. –