57

我想发送一个 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 是同一个键的一部分。

4

7 回答 7

31

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

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

于 2009-01-14T20:39:17.337 回答
20

你也可以使用 Spring 的UriUtils

于 2011-07-16T03:48:28.357 回答
9

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

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

于 2009-12-30T22:05:48.777 回答
3

我自己写的,很短,超级简单,喜欢的可以复制一下: http ://www.dmurph.com/2011/01/java-uri-encoder/

于 2011-01-17T06:15:59.537 回答
2

似乎来自 Google GData-java-client 的CharEscapers有你想要的。它具有 uriPathEscaper 方法、uriQueryStringEscaper 和通用 uriEscaper。(全部返回执行实际转义的 Escaper 对象)。阿帕奇许可证。

于 2009-01-14T19:30:01.783 回答
-2

我认为URI 类是您正在寻找的类。

于 2009-01-14T18:33:09.637 回答
-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

正如预期的那样。

这会有什么问题?

于 2009-01-14T19:44:19.227 回答