Как мне кодировать значения параметров URI? - PullRequest
55 голосов
/ 14 января 2009

Я хочу отправить URI в качестве значения параметра запроса / матрицы. Прежде чем я смогу добавить его к существующему 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 не имеет механизма для кодирования одного значения за раз, поэтому он не может знать, что value1 и value2 являются частью одного и того же ключа.

Ответы [ 7 ]

30 голосов
/ 14 января 2009

Джерси UriBuilder кодирует компоненты URI, используя application / x-www-form-urlencoded и RFC 3986 по мере необходимости. Согласно Javadoc

Методы Builder выполняют контекстное кодирование символов, недопустимых в соответствующем компоненте URI, в соответствии с правилами типа носителя application / x-www-form-urlencoded для параметров запроса и RFC 3986 для всех других компонентов. Следует отметить, что только символы, не разрешенные в конкретном компоненте, подлежат кодированию, поэтому, например, путь, предоставленный одному из методов пути, может содержать параметры матрицы или несколько сегментов пути, поскольку разделители являются допустимыми символами и не будут кодироваться. Процентные значения также распознаются, где это разрешено, и не будут кодироваться дважды.

18 голосов
/ 16 июля 2011

Вы также можете использовать Spring's UriUtils

9 голосов
/ 31 декабря 2009

У меня недостаточно репутации, чтобы комментировать ответы, но я просто хотел отметить, что загрузка API JSR-311 сама по себе не будет работать. Вам необходимо скачать эталонную реализацию ( Джерси ).

Только загрузка API со страницы JSR даст вам ClassNotFoundException, когда API пытается найти реализацию во время выполнения.

4 голосов
/ 17 января 2011

Я написал свой собственный, он короткий, очень простой, и вы можете скопировать его, если хотите: http://www.dmurph.com/2011/01/java-uri-encoder/

2 голосов
/ 14 января 2009

Кажется, что CharEscapers от Google GData-java-client имеет то, что вы хотите. Он имеет метод uriPathEscaper, uriQueryStringEscaper и универсальный uriEscaper. (Все возвращают Escaper объект, который делает фактическое экранирование). Лицензия Apache.

0 голосов
/ 14 января 2009

Мммххххххххххххх Я знаю, что вы уже отказались от 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

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

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

0 голосов
/ 14 января 2009

Я думаю, что URI-класс - это тот, который вы ищете.

...