Экранирование амперсандов в URL-адресах для запросов HttpClient
-
23-09-2019 - |
Вопрос
Итак, у меня есть некоторый Java-код, который использует Jakarta HttpClient следующим образом:
URI aURI = new URI( "http://host/index.php?title=" + title + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery());
Проблема в том, что если title
включает любые амперсанды (&), они считаются разделителями параметров, и запрос выходит из строя...и если я заменю их эквивалентом с экранированным URL-адресом %26
, затем это дважды экранируется с помощью getEscapedPathQuery() в %2526
.
В настоящее время я работаю над этим, в основном устраняя повреждения после этого:
URI aURI = new URI( "http://host/index.php?title=" + title.replace("&", "%26") + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery().replace("%2526", "%26"));
Но там имеет чтобы было приятнее это делать, верно?Обратите внимание, что заголовок может содержать любое количество непредсказуемых символов UTF-8 и т.д., поэтому экранирование всего остального является обязательным требованием.
Решение
Ну вот:
import java.net.URLEncoder;
...
...
URI aURI = new URI( "http://host/index.php?title=" + URLEncoder.encode(title,"UTF-8") + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getPathQuery());
Проверять java.net.urlencoder для получения дополнительной информации.
Другие советы
Почему вы называете getescapedpathquery (), если вы не хотите сбежать? Просто решите, кто это ответственность, и будьте последовательны.
Используйте Средств кодирования класс.
Служебный класс для кодирования HTML-форм.Этот класс содержит статические методы для преобразования строки в формат application/x-www-form-urlencoded MIME.Для получения дополнительной информации о кодировке HTML-форм обратитесь к спецификации HTML.