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

Я хочу отправить 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 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам