我注意到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 = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
答案 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。