Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 冒号是否需要在URI查询参数中进行编码?_Http_Url_Web_Uri_Urlencode - Fatal编程技术网

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

Http 冒号是否需要在URI查询参数中进行编码?,http,url,web,uri,urlencode,Http,Url,Web,Uri,Urlencode,我注意到Java的UriBuilder没有对查询参数值(ISO 8601格式的字符串)中包含的:字符进行编码 根据维基百科,冒号似乎应该被编码 具体而言,对查询字符串进行编码时使用以下规则: 字母(A-Z和A-Z)、数字(0-9)和字符“.”、“-”、“~”和“u”保持原样 空格编码为“+”或%20[需要引用] 所有其他字符编码为%FF十六进制表示,任何非ASCII字符首先编码为UTF-8(或其他指定字符) 编码) 那么,怎么回事?查询参数中的冒号是否应该编码 更新: 我查阅了URI语法规

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

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

具体而言,对查询字符串进行编码时使用以下规则:

  • 字母(A-Z和A-Z)、数字(0-9)和字符“.”、“-”、“~”和“u”保持原样
  • 空格编码为“+”或%20[需要引用]
  • 所有其他字符编码为%FF十六进制表示,任何非ASCII字符首先编码为UTF-8(或其他指定字符) 编码)
那么,怎么回事?查询参数中的冒号是否应该编码


更新:

我查阅了URI语法规范(),看起来在查询参数中编码冒号真的是不必要的。以下是ABNF for URI的摘录:

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

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


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

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

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


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

谢谢你,恩里科。这似乎源于冲突。虽然维基百科(和其他地方)说应该对它们进行编码,但如果你看一下URI语法规范中的ABNF,它们似乎没有。请参阅我答案的更新。这在技术上是不正确的。在查询中允许冒号。看见如果我错了,请纠正我,但根据您的链接:“:”是保留的gen delim和“保留集中的任何[gen delims]都是‘保留’的,用作组件内的子组件分隔符”(即sub delims)。我只是解释ABNF,它允许将“:”作为查询字符串的一部分。这也与Java的UriBuilder的行为以及我在.NET上测试的一些代码相匹配。尽管如此,当您指出文本建议它应该执行不同的操作时,还是令人困惑。有趣的是,这两种方法
UriBuilder.queryParam(名称、值)
似乎与
UriBuilder.replaceQuery(查询)
具有不同的编码规则。前者编码<代码>':'
字符,而后者不编码,至少在RESTEasy 3.0.7.Final中是这样。这是故意的行为吗?你有没有解释为什么存在这种差异?