当前位置: 首页 > 知识库问答 >
问题:

冒号需要在URI查询参数中编码吗?

东门茂实
2023-03-14

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

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

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

    null

那么,怎么回事?查询参数中的冒号是否应该编码?

更新:

我查阅了URI语法规范(RFC3986),看起来在查询参数中编码冒号真的没有必要。以下是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    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=

共有2个答案

孔君浩
2023-03-14

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

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

然而,JAX-RS的泽西实现不按此规范运行,并根据RFC 3986对所有内容进行编码。这是一个错误,看到JIRA票。

白彦
2023-03-14

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

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

 类似资料:
  • 问题内容: 出现错误: 如何在HQL中使用此语法? 基本上问题是我想在查询中使用冒号(:),但是当hibernate看到冒号时,它认为这是一个参数(:parameterName是HQL中参数的语法),正如您从我的2个uses中可以看到的()。 但是,当我使用now():: date语句时,它是特定的postgreSQL语法,因此hibernate会破坏所有内容。 问题答案: 由于您使用的是Post

  • 在Java中,如何对url上的查询参数进行编码?我知道,这似乎是一个显而易见的问题。 有两个微妙之处我不确定: URL上的空格应该编码为"或"吗?在chrome中,如果我输入“http://google.com/foo=?bar我”chrome将其更改为编码 是否有必要/正确地将冒号":"编码为;?Chrome没有。 注意事项: 似乎不起作用,它似乎是用于编码要提交表单的数据。例如,它将空格编码为

  • 问题内容: 如何在Java中将查询参数编码为URL?我知道,这似乎是一个显而易见且已经提出的问题。 我不确定有两个微妙之处: 网址上的空格应该编码为“ +”还是“%20”?在chrome中,如果我输入“ http://google.com/foo=?bar me”,则chrome会将其更改为使用%20进行编码 是否有必要/正确将冒号“:”编码为%3B?Chrome没有。 笔记: 似乎不起作用,似乎

  • 问题内容: 我有一张table,上面有所有学生的评分。我正在尝试获得范围内所有学生的人数,例如 0-9 =学生人数9 , 10 -19 =学生人数0 ,依此类推,最多100。 另外,如果有一些机构可以指出关于 案例陈述 的不错的教程,那将是非常好的 给出的答案很好。 但我的范围是固定的。如果没有申请人,我也必须显示0。 这是我的问题的主要区别。就像我也显示了类别。 问题答案: 您不需要声明。您可以

  • 我试图理解Android的意图机制,对一个我想解决的问题感到困惑。 Android为intent提供了动作数据类别 我想问为什么数据是URI 为什么一切都不能成为一种行为和行为的范畴? URI有什么价值 我问所有这些也是因为当我看到像电话、消息和地图这样的应用程序时,他们都试图使用URI来获取一些可能通过EXTRAS获得的数据。 有人请帮我澄清Android意图机制的设计方面。

  • 我有这个quarkus rest API: api工作得很好,但是如果我将此值传递给方法,rest客户端将其编码为'USSU%25OS':