【问题标题】:Are query parameters allowed in opaque URIs?不透明 URI 中是否允许使用查询参数?
【发布时间】:2018-03-31 16:39:00
【问题描述】:

Java 的 URI 类定义不透明 URI 如下(强调我的)。

当且仅当 URI 是绝对的并且其特定于方案的部分不以斜杠字符 ('/') 开头时,它才是不透明的。一个不透明的 URI 有一个方案,一个特定于方案的部分,可能还有一个片段; 所有其他组件都未定义

根据文档,不透明的 URI 会为查询参数返回 null

URI uri = URI.create("stackoverflow:foo?key=value#frag");
uri.isOpaque() == true
uri.getScheme() == stackoverflow
uri.getSchemeSpecificPart() == foo?key=value
uri.getQuery() == null
uri.getFragment() == frag

这种行为是否特定于 Java 的 URI 实现,或者 URI 规范是否不允许不透明 URI 中的查询参数?

【问题讨论】:

    标签: java uri query-parameters


    【解决方案1】:

    Java 的URI 类是documented 符合RFC 2396RFC 2732

    除了下面提到的一些小偏差之外,此类的一个实例表示 RFC 2396 定义的 URI 引用:统一资源标识符 (URI):通用语法,经 RFC 2732 修订:URL 中文字 IPv6 地址的格式。

    第 3 节. URI 语法组件 没有明确禁止 不透明 URI 中的查询组件,而只是没有为它们定义一个语法。根据定义,不透明的 URI 需要特定于方案的知识才能知道 if 是否存在类似于查询组件的内容以及确切的 如何 来解析它。拥有一个是完全合法的,但如果没有这种特殊知识,就不能在一般意义上(根据本 RFC)支持它。相关的 RFC 文本是:

    URI 语法取决于方案。一般来说,绝对 URI的写法如下:

    <scheme>:<scheme-specific-part>
    

    绝对 URI 包含正在使用的方案的名称 (&lt;scheme&gt;) 后跟一个冒号 (":"),然后是一个字符串 (&lt;scheme-specific-part&gt;) 其解释取决于方案。

    只有 通用语法 提供 RFC 定义的查询组件,并且该语法要求在方案后的第一个冒号 (:) 之后至少有一个斜杠 (/)。

    URI 语法不要求方案特定部分具有 任何通用的结构或语义集 URI。但是,URI 的一个子集确实共享一个通用语法 表示命名空间内的层次关系。这 “通用 URI”语法由四个主要部分组成:

    <scheme>://<authority><path>?<query>
    

    除了&lt;scheme&gt;之外,每个都可能在特定的URI中不存在。 例如,某些 URI 方案不允许使用 &lt;authority&gt; 组件, 和其他人不使用&lt;query&gt; 组件。

    absoluteURI   = scheme ":" ( hier_part | opaque_part )
    
    ...
    
    hier_part     = ( net_path | abs_path ) [ "?" query ]
    net_path      = "//" authority [ abs_path ]>
    abs_path      = "/"  path_segments
    

    上述两个 RFC 都是 obsoleted by RFC 3986,但由于 backwards-compatibility 的原因,Java 现有的 API 和行为是 unlikely to be changed

    URI 实现与较新的 RFC 不同,不仅在于它如何定义 URI 的有效组件,还在于 行为上。例如,参见:

    快速搜索会发现至少有一个开源 library 试图提供与 RFC 3986 兼容的实现,但前面的链接既不是认可也不是推荐。与现有的基于 java.net.URI 的 API 的兼容性可能会受到限制。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多