如何编码URI参数值?

时间:2009-01-14 18:21:24

标签: java url rest urlencode rfc2396

我想发送一个URI作为查询/矩阵参数的值。在我将它附加到现有URI之前,我需要根据RFC 2396对其进行编码。例如,给定输入:

http://google.com/resource?key=value1 & value2

我期待输出:

http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2

java.net.URLEncoderjava.net.URI都不会生成正确的输出。 URLEncoder用于HTML表单编码,与RFC 2396不同。URI没有一次编码单个值的机制,因此无法知道value1和value2是同样的关键。

7 个答案:

答案 0 :(得分:30)

泽西岛的UriBuilder根据需要使用application / x-www-form-urlencoded和RFC 3986对URI组件进行编码。根据Javadoc

  

构建器方法根据查询参数的application / x-www-form-urlencoded媒体类型和所有其他组件的RFC 3986的规则,对相应URI组件中不允许的字符执行上下文编码。注意,只有特定组件中不允许的字符才能进行编码,因此,例如,提供给其中一个路径方法的路径可能包含矩阵参数或多个路径段,因为分隔符是合法字符并且不会被编码。编码值的百分比也在允许的情况下被识别,并且不会被双重编码。

答案 1 :(得分:18)

你也可以使用Spring的UriUtils

答案 2 :(得分:9)

我没有足够的声誉来评论答案,但我只想注意,单独下载JSR-311 api是行不通的。您需要下载参考实现(jersey)。

当api试图在运行时查找实现时,只从JSR页面下载api会给你一个ClassNotFoundException。

答案 3 :(得分:4)

我写了自己的,简短,非常简单,你可以复制它,如果你喜欢: http://www.dmurph.com/2011/01/java-uri-encoder/

答案 4 :(得分:2)

来自Google GData-java-client的CharEscapers似乎有你想要的。它有uriPathEscaper方法,uriQueryStringEscaper和泛型uriEscaper。 (全部返回实际转义的Escaper对象)。 Apache许可证。

答案 5 :(得分:-2)

我认为URI class是您正在寻找的那个。

答案 6 :(得分:-3)

嗯,我知道你已经放弃了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

正如所料。

这有什么问题?