我正在使用Java URL构造函数"URL(URL上下文,字符串规范)"在这里找到,但构造的URL不是我期望的-它遗漏了上下文参数中提供的路径段。
作为一个例子,下面的代码new URL(new URL("http://asdf.com/z"), "a/b/c");
生成值为
的URLhttp://asdf.com/a/b/c所以省略了"z"路径段。
我有两个问题:
- "上下文"是什么意思?Java文档中的第一个参数是什么?我没有在URL规范中找到它,也没有在java文档中找到它。
- 省略了"z"预期行为?
谢谢!
"上下文"是什么意思?Java文档中的第一个参数是什么?
它就像基础URL"spec
参数。如果context
是https://example.com
,spec
是/foo
,则构造器将创建https://example.com/foo
。这类似于(但不完全相同,我们稍后会看到)问"我目前在https://example.com
,我想去/foo
,我的最终URL是什么?">
省略了"z"预期行为?
是的。如果您遵循RFC 2396中针对基本URL解析相对URL的规则,那么您将达到以下步骤:
(6)如果到达这一步,那么我们正在解析一个相对路径参考。相对路径需要与base合并URI的路径。虽然有很多方法可以做到这一点,但我们将描述一个使用单独字符串缓冲区的简单方法。
(a)除了最后一段之外,基本URI的路径组件的所有部分都是复制到缓冲区。换句话说,后面的任何字符最后一个(最右边)斜杠字符,如果有,则不包含。
(b)引用的path组件被附加到缓冲区中字符串。
最后一段这里,指的是z
,也就是添加到缓冲区中的而不是。在此之后,路径a/b/c
被附加到缓冲区中。步骤(c)以后处理删除.
和..
,这在这里是无关的。
请注意,RFC 2386并没有说你必须以这种方式实现算法,但无论你的实现是什么,你的输出必须匹配该算法的输出:
上面的算法旨在提供一个示例实现的输出可以被测试不需要算法本身。
是的,这是预期的。为了保留/z
,您应该在z
之后添加另一个/
:
new URL(new URL("http://asdf.com/z/"), "a/b/c")
这样"最后一段"变成空字符串。
您可以将上下文视为文件系统中的当前目录。
对于context "http://asdf.com/z",当前目录是"http://asdf.com/",并使用"a/b/c"由于该规范将产生一个完整的路径"http://asdf.com/a/b/c"。