冒号是否需要在URI查询参数中进行编码?

时间:2012-12-04 23:12:59

标签: http url web uri urlencode

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

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

  

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

     
      
  • 字母(A-Z和a-z),数字(0-9)和字符'。',' - ','〜'和'_'保持原样
  •   
  • SPACE编码为'+'或%20 [需要引证]
  •   
  • 所有其他字符编码为%FF十六进制表示,其中任何非ASCII字符首先编码为UTF-8(或其他指定)   编码)
  •   

那么,这笔交易是什么?查询参数中的冒号是否应该编码?


更新:

我查找了URI语法规范(RFC 3986),看起来在查询参数中编码冒号实际上并不是必需的。以下是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    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

Java SDK中没有UriBuilder,它由JAX-RS定义。它是documentation个状态查询参数应该是URL编码的,其他组件使用RFC 3986进行编码。

  

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

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