26

我注意到 Java没有对包含在我的查询参数值(ISO 8601 格式的字符串)中UriBuilder的字符进行编码。:

根据维基百科,似乎应该对冒号进行编码。

特别是,对查询字符串进行编码使用以下规则:

  • 字母(AZ 和 az)、数字 (0-9) 和字符 '.'、'-'、'~' 和 '_' 保持原样
  • SPACE 编码为 '+' 或 %20[需要引用]
  • 所有其他字符都编码为 %FF 十六进制表示,任何非 ASCII 字符首先编码为 UTF-8(或其他指定的编码)

那么,有什么关系呢?查询参数中的冒号是否应该编码?


更新:

我查阅了 URI 语法规范(RFC 3986),看起来确实没有必要在查询参数中编码冒号。这是 URI 的 ABNF 的摘录:

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
4

2 回答 2

11

是的,它们应该被编码在查询字符串中。正确的编码是%3A

但是,我可以理解为什么 UriBuilder 不编码:。您不想在绝对 URI 中的协议之后(例如http:)或用户名和密码之间(例如 )对冒号进行编码。ftp://username:password@domain.com

于 2012-12-04T23:19:47.003 回答
5

Java SDK 中没有UriBuilder,它是由 JAX-RS 定义的。它的文档指出查询参数应该是 URL 编码的,其他组件是使用 RFC 3986 编码的。

构建器方法执行相应 URI 组件中不允许的字符的上下文编码,遵循application/x-www-form-urlencoded查询参数的媒体类型规则和所有其他组件的 RFC 3986

但是,JAX-RS 的 Jersey 实现不符合此规范,并根据 RFC 3986 对所有内容进行编码。这是一个错误,请参阅JIRA 票证

于 2014-08-26T08:24:40.937 回答