Я хочу отправить URI в качестве значения параметра query/matrix. Прежде чем я могу добавить его в существующий URI, мне нужно закодировать его в соответствии с RFC 2396. Например, с учетом ввода:
http://google.com/resource?key=value1 & value2
Я ожидаю результат:
http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2
Ни java.net.URLEncoder
, ни java.net.URI
не сгенерирует правильный вывод. URLEncoder
предназначен для кодирования HTML-формы, который не совпадает с RFC 2396. URI
не имеет механизма для кодирования одного значения за раз, поэтому он не знает, что значение1 и значение2 являются частью одного и того же ключа.
Ответ 1
Джерси UriBuilder кодирует компоненты URI с использованием application/x-www-form-urlencoded и RFC 3986 по мере необходимости. Согласно Джавадоку
Методы Builder выполняют контекстное кодирование символов, которые не разрешены в соответствующем компоненте URI, следуя правилам типа приложения /x -www-form-urlencoded для параметров запроса и RFC 3986 для всех других компонентов. Обратите внимание, что только символы, не разрешенные в конкретном компоненте, подлежат кодированию, поэтому, например, путь, предоставленный одному из методов пути, может содержать параметры матрицы или несколько сегментов пути, поскольку разделители являются юридическими символами и не будут закодированы. Проценты, закодированные в процентах, также распознаются там, где они разрешены и не будут закодированы двойным образом.
Ответ 2
Вы также можете использовать Spring UriUtils
Ответ 3
У меня недостаточно репутации, чтобы комментировать ответы, но я просто хотел отметить, что загрузка JSR-311 api сама по себе не сработает. Вам нужно как минимум загрузить эталонную реализацию (jersey).
Просто загрузка api с страницы JSR просто даст вам ClassNotFoundException, когда api попытается найти реализацию во время выполнения.
Ответ 4
Я написал свой собственный, короткий, супер простой, и вы можете скопировать его, если хотите:
http://www.dmurph.com/2011/01/java-uri-encoder/
Ответ 5
Кажется, что CharEscapers от Google GData-java-клиент имеет то, что вы хотите. Он имеет метод uriPathEscaper, uriQueryStringEscaper и общий uriEscaper. (Все возвращают объект Escaper, который действительно ускользает). Лицензия Apache.
Ответ 6
Я думаю, что URI class - тот, который вы ищете.
Ответ 7
Mmhh Я знаю, что вы уже отбросили URLEncoder, но, несмотря на то, что говорят документы, я решил попробовать.
Ты сказал:
Например, с учетом ввода:
http://google.com/resource?key=value
Я ожидаю результат:
HTTP% 3a% 2f% 2fgoogle.com% 2fresource% 3fkey% 3dvalue
Итак:
C:\oreyes\samples\java\URL>type URLEncodeSample.java
import java.net.*;
public class URLEncodeSample {
public static void main( String [] args ) throws Throwable {
System.out.println( URLEncoder.encode( args[0], "UTF-8" ));
}
}
C:\oreyes\samples\java\URL>javac URLEncodeSample.java
C:\oreyes\samples\java\URL>java URLEncodeSample "http://google.com/resource?key=value"
http%3A%2F%2Fgoogle.com%2Fresource%3Fkey%3Dvalue
Как и ожидалось.
В чем проблема с этим?