小编jam*_*hid的帖子

有没有办法用java.net.URI在查询arg中发送%2b(编码加号)?

我似乎无法明确地提到这一点,但是如果你使用java.net.URI,似乎你不能发送转义加号("%2b")作为查询arg值,因为查询arg被逃脱了.

// bad: http://example.com/foo?a=%252b
new URI("http", null, "example.com", 80, "/foo", "a=%2b", null);
Run Code Online (Sandbox Code Playgroud)

尝试了一个实际的"+"字符,但它按原样发送,因此服务器会将其解释为空格.

// bad: http://example.com/foo?a=+
new URI("http", null, "example.com", 80, "/foo", "a=+", null);
Run Code Online (Sandbox Code Playgroud)

所以我想你只需要自己进行查询arg键和值的百分比编码,并使用不会转义的单参数URI构造函数?也许让URI逃脱"路径",因为规则很棘手(例如,"+"字符表示加号字符,而不是空格,当在路径中时):

// good: http://example.com/foo?a=%2b
new URI(new URI("http", null, "example.com", 80, "/foo", null, null).toASCIIString() + "?a=%2b");
Run Code Online (Sandbox Code Playgroud)

此外,文档声称您可以创建这样的URI,它将与源URI相同:

URI u = ...;
URI identical = new URI(u.getScheme(),
        u.getUserInfo(),
        u.getPath(), u.getQuery(),
        u.getFragment());
Run Code Online (Sandbox Code Playgroud)

但是当它包含%2b时则不是这样

URI u = new URI("http://example.com:80/foo?a=%2b");
URI identical = ...; // not identical! http://example.com:80/foo?a=+
Run Code Online (Sandbox Code Playgroud)

令人沮丧,我猜这就是为什么每个人都使用apache commons或spring classes?

PS:http://docs.oracle.com/javase/6/docs/api/java/net/URI.html引用了"以下身份也保留"部分中不存在的URI构造函数.它需要删除"权限"参数.

java

6
推荐指数
1
解决办法
2639
查看次数

标签 统计

java ×1