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

Hol*_*osa 19 url uri http urlencode web

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

根据维基百科,似乎冒号应编码.

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

  • 字母(AZ和az),数字(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    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
Run Code Online (Sandbox Code Playgroud)

Enr*_*ico 9

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

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

  • 谢谢,恩里科。看来来源有冲突。虽然维基百科(和其他地方)说它们应该被编码,但如果您查看 URI 语法规范中的 ABNF,您会发现它们似乎没有编码。请参阅我的答案的更新。 (2认同)

and*_*ras 5

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

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

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