Скажи у меня есть URL
http://example.com/query?q=
и у меня есть запрос, введенный пользователем, такой как:
случайное слово £ 500 банк $
Я хочу, чтобы результат был правильно закодированным URL:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
Какой лучший способ достичь этого? Я попытался URLEncoder
создать объекты URI / URL, но ни один из них не получился совершенно правильным.
Ответы:
URLEncoder
это путь Вам нужно только помнить, что нужно кодировать только имя и / или значение отдельного параметра строки запроса, а не весь URL-адрес, чтобы не быть&
ни символа разделителя параметра строки запроса, ни символа разделителя имени-значения параметра=
.Обратите внимание, что пробелы в параметрах запроса представлены
+
, а не%20
, что является допустимым.%20
, Как правило , будет использоваться для представления пробелов в самом (часть перед URI-запрос строки символа - разделителя URI?
), а не в строке запроса (часть после?
).Также обратите внимание, что есть три
encode()
метода. Один безCharset
второго аргумента и другой соString
вторым аргументом, который генерирует проверенное исключение. Тот безCharset
аргументов устарел. Никогда не используйте его и всегда указывайтеCharset
аргумент. Javadoc даже явно рекомендует использовать кодировку UTF-8, как это предусмотрено в RFC3986 и W3C .Смотрите также:
источник
URLEncoder
для параметров запроса в кодировке URL соответствуетapplication/x-www-form-urlencoded
правилам. Параметры пути не вписываются в эту категорию. Вам нужен кодировщик URI вместо этого.Я бы не использовал
URLEncoder
. Помимо неправильного имени (неURLEncoder
имеет ничего общего с URL-адресами), он неэффективен (он используетStringBuffer
вместо Builder и выполняет несколько медленных действий). Его также слишком легко облажать.Вместо этого я хотел бы использовать
URIBuilder
или Spring ,org.springframework.web.util.UriUtils.encodeQuery
или Commons ApacheHttpClient
. Причина в том, что вы должны избегать имени параметров запроса (т.е. ответа BalusCq
) иначе, чем значение параметра.Единственный недостаток вышеизложенного (который я обнаружил до боли) - это то, что URL не являются истинным подмножеством URI .
Образец кода:
Поскольку я просто ссылаюсь на другие ответы, я отметил это как вики сообщества. Не стесняйтесь редактировать.
источник
URLEncoder
это, как говорит его javadoc, намерение кодировать параметры строки запроса,application/x-www-form-urlencoded
как описано в спецификации HTML: w3.org/TR/html4/interact/… . Некоторые пользователи действительно путают / злоупотребляют им для кодирования целых URI, как, по-видимому, сделал нынешний ответчик.Вам нужно сначала создать URI, например:
Затем преобразуйте этот Uri в строку ASCII:
Теперь ваша строка URL полностью закодирована. Сначала мы сделали простое кодирование URL, а затем преобразовали ее в строку ASCII, чтобы убедиться, что в строке не осталось символов вне US-ASCII. Именно так и поступают браузеры.
источник
URL.toURI()
нет.+
замену пробелов, но принял% 20, так что это решение работало лучше, чем BalusC, спасибо!В Guava 15 добавлен ряд простых экранировщиков URL .
источник
URLEncoder
.URLEncoder
не делает.Библиотека Apache Http Components предоставляет удобную опцию для построения и кодирования параметров запроса -
С использованием HttpComponents 4.x - URLEncodedUtils
Для использования HttpClient 3.x - EncodingUtil
источник
Вот метод, который вы можете использовать в своем коде для преобразования строки URL-адреса и сопоставления параметров в допустимую кодированную строку URL-адреса, содержащую параметры запроса.
источник
Печать
Что здесь происходит?
1. Разделить URL на структурные части. Используйте
java.net.URL
для этого.2. Правильно закодируйте каждую деталь конструкции!
3. Используйте
IDN.toASCII(putDomainNameHere)
для Punycode кодирования имени хоста!4. Используйте
java.net.URI.toASCIIString()
для кодирования в процентах, кодированный в NFC Unicode - (лучше было бы NFKC!). Для получения дополнительной информации см .: Как правильно закодировать этот URLВ некоторых случаях рекомендуется проверить, не закодирован ли уже URL . Также замените кодированные пробелом «+» пробелами «% 20».
Вот несколько примеров, которые также будут работать правильно
Решение проходит около 100 тестовых случаев, предоставленных Web Plattform Tests .
источник
В Android я бы использовал этот код:
Где
Uri
находитсяandroid.net.Uri
источник
В моем случае мне просто нужно было передать весь URL и кодировать только значение каждого параметра. Я не нашел общий код для этого (!!), поэтому я создал этот небольшой метод для выполнения этой работы:
Он использует org.apache.commons.lang3.StringUtils
источник
Вы можете использовать следующий код.
источник
=
и&
разделители, которые не является правильным.