Как кодировать значения параметров URI?

Я хочу отправить 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 попытается найти реализацию во время выполнения.

Ответ 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

Как и ожидалось.

В чем проблема с этим?