Как мне кодировать значения параметров 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 для всех других компонентов. Следует отметить, что только символы, не разрешенные в конкретном компоненте, подлежат кодированию, поэтому, например, путь, предоставленный одному из методов пути, может содержать параметры матрицы или несколько сегментов пути, поскольку разделители являются допустимыми символами и не будут кодироваться. Процентные значения также распознаются там, где это разрешено, и не будут кодироваться дважды.
У меня недостаточно репутации, чтобы комментировать ответы, но я просто хотел отметить, что загрузка 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.
Ммм, я знаю, что вы уже отказались от 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
Как и ожидалось.
В чем будет проблема с этим?