Экранирование амперсандов в URL-адресах для запросов HttpClient

StackOverflow https://stackoverflow.com/questions/2558111

Вопрос

Итак, у меня есть некоторый 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top