首页 > 解决方案 > Java URL 构造函数忽略路径段

问题描述

我正在使用此处找到的 Java URL 构造函数“URL(URL 上下文,字符串规范)”,但构造的 URL 不是我所期望的 - 它遗漏了上下文参数中提供的路径段。

例如,这段代码

new URL(new URL("http://asdf.com/z"), "a/b/c");

产生一个带有值的 URL

http://asdf.com/a/b/c

所以它已经离开了“z”路径段。

我有两个问题:

  1. java doc中第一个参数“context”是什么意思?我在 URL 规范中找不到提及它,也没有在 java 文档中真正找到它。
  2. 是否遗漏了“z”预期行为?

谢谢!

标签: javaurlpathsegment

解决方案


java doc中第一个参数“context”是什么意思?

这就像spec参数的“基本 URL”。如果contextishttps://example.comspecis /foo,构造函数将创建https://example.com/foo. 它类似于(但不完全相同,我们稍后会看到)询问“我目前在https://example.com,我想去/foo,我的最终 URL 是什么?”

是否遗漏了“z”预期行为?

是的。如果您遵循RFC 2396 中针对此案例的基本 URL 解析相对 URL 的规则,您将到达此步骤:

(6) 如果达到此步骤,那么我们正在解析相对路径引用。相对路径需要与基本 URI 的路径合并。虽然有很多方法可以做到这一点,但我们将描述一个使用单独的字符串缓冲区的简单方法。

(a) 除了基 URI 路径组件的最后一段之外的所有部分都被复制到缓冲区。换句话说,最后一个(最右边)斜线字符之后的任何字符(如果有)都将被排除。

(b) 引用的路径组件附加到缓冲区字符串。

此处的“最后一段”是指z,并且不会添加到缓冲区中。在那之后,路径a/b/c“被附加到缓冲区”。以后的步骤 (c) 处理删除...,这在此处无关紧要。

请注意,RFC 2386 并没有说您必须以​​这种方式实现算法,但无论您的实现是什么,您的输出都必须与该算法的输出相匹配:

上述算法旨在提供一个示例,通过该示例可以测试实现的输出——不需要算法本身的实现。

所以,是的,这是意料之中的。要保留,您应该在之后/z添加另一个:/z

new URL(new URL("http://asdf.com/z/"), "a/b/c")

这样,“最后一段”就变成了空字符串。


推荐阅读