我如何编码URI参数值?
我想发送一个URI作为查询/matrix参数的值。 在将其附加到现有的URI之前,我需要根据RFC 2396对其进行编码。例如,给定input:
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是同一个键的一部分。
Jersey的UriBuilder根据需要使用application / x-www-form-urlencoded和RFC 3986编码URI组件。 根据Javadoc
生成器方法根据应用程序/ x-www-form-urlencoded媒体types的查询参数的规则以及所有其他组件的RFC 3986,对相应URI组件中不允许的字符执行上下文编码。 请注意,只有特定组件不允许使用的字符才能进行编码,因此,例如,提供给其中一个path方法的path可能包含matrix参数或多个path段,因为分隔符是合法的字符,不会被编码。 编码百分比的值在允许的地方也被识别,并且不会被双重编码。
你也可以使用Spring的UriUtils
我没有足够的声望评论答案,但我只是想指出,下载JSR-311 api本身是行不通的。 您至less需要下载参考实现( 泽西岛 )。
只要从JSR页面下载API就会给你一个ClassNotFoundException,当API试图在运行时查找一个实现。
我写了我自己的,它简短,超级简单,你可以复制它,如果你喜欢: http : //www.dmurph.com/2011/01/java-uri-encoder/
似乎从谷歌GData-Java客户端CharEscapers有你想要的。 它有uriPathEscaper方法,uriQueryStringEscaper和通用uriEscaper。 (全部返回实际逃脱的Escaper对象)。 Apache许可证。
我认为URI类是你正在寻找的。
嗯,我知道你已经放弃了URLEncoder,但是尽pipe文档说了什么,我决定尝试一下。
你说:
例如,给出一个input:
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
正如所料。
这会有什么问题呢?