不要冒号需要URI查询参数编码?(Do colons require encoding in URI

2019-08-03 13:07发布

我注意到,Java的UriBuilder不编码:包含在我的查询参数值(ISO 8601格式的字符串)字符。

根据维基百科,它似乎应该结肠进行编码。

尤其是,编码的查询字符串使用以下规则:

  • 字母(AZ和az),数字(0-9)和字符, ' '' - ', '〜' 和 '_' 被保持原样
  • SPACE被编码为“+”或%20 [编辑]
  • 所有其他字符被编码为FF%十六进制表示与第一编码为UTF-8(或其他指定的编码)的任何非ASCII字符

那么,这是怎么回事? 应查询参数冒号编码或不是?


更新:

我抬起头的URI语法规范( RFC 3986 ),它看起来像在查询编码冒号PARAMS实在是没有必要的。 下面是来自ABNF的URI的摘录:

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

Answer 1:

是的,他们应该在查询字符串进行编码。 正确的编码是%3A

不过,我可以理解为什么UriBuilder不编码: 。 你不想协议后(如结肠编码http:或用户名和密码之间(如ftp://username:password@domain.com中的绝对URI)。



Answer 2:

有没有UriBuilder在Java SDK,它是由JAX-RS定义。 这是文件状态的查询参数进行网址编码,其它部件均采用RFC 3986编码。

生成器方法执行以下的规则相应的URI部件不允许的字符的上下文编码application/x-www-form-urlencoded媒体查询参数类型和RFC 3986为所有其它部件

然而,新泽西州实施JAX-RS的不通过该规范根据RFC 3986.玩了,一切都进行编码,是一个错误,请参阅JIRA票 。



文章来源: Do colons require encoding in URI query parameters?