java - Java URL 构造函数忽略路径段
问题描述
我正在使用此处找到的 Java URL 构造函数“URL(URL 上下文,字符串规范)”,但构造的 URL 不是我所期望的 - 它遗漏了上下文参数中提供的路径段。
例如,这段代码
new URL(new URL("http://asdf.com/z"), "a/b/c");
产生一个带有值的 URL
所以它已经离开了“z”路径段。
我有两个问题:
- java doc中第一个参数“context”是什么意思?我在 URL 规范中找不到提及它,也没有在 java 文档中真正找到它。
- 是否遗漏了“z”预期行为?
谢谢!
解决方案
java doc中第一个参数“context”是什么意思?
这就像spec
参数的“基本 URL”。如果context
ishttps://example.com
和spec
is /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")
这样,“最后一段”就变成了空字符串。
推荐阅读
- swift - 使用添加的 url 方案时,Urls 不会打开
- python - IntegrityError:数据类型不匹配
- java - 所以这是我的程序,但我不知道如何将 :40036 的所有数字仅重定向或仅重定向到新数据文件中?
- javascript - 使用 Firebase 云功能有条件地发送通知?
- r - 绘图不显示负值
- bash - Git-Bash 文件查找取决于文件类型
- excel - 如何从用户窗体向变量添加文本框值?
- bash - 是否可以使用 write com.apple.dock tilesize 在 Mojave/Sierra 上运行设置 Dock 的大小?
- angular - 角度清除缓存的路由器 url 值
- azure - 如何在 npm 任务中使用秘密任务变量