结构new URL(new URL(new URL("http://localhost:4567"), "abc"), "def")
产生(虽然不正确)此url: http://localhost:4567/def
而结构new URL(new URL(new URL("http://localhost:4567"), "abc/"), "def")
产生正确的(我想要的)url: http://localhost:4567/abc/def
区别在于abc
构造函数参数中的尾斜杠。
这是预期的行为或这是一个错误,应该在URL类修复?
毕竟,当您使用一些帮助类来构建URL时,不需要担心斜杠。
引用javadoc of new URL(URL context, String spec)
:
否则,该路径被视为相对路径,并被附加到上下文路径,如RFC2396所述。
参见RFC2396规范第5节"相对URI引用",特别是第5.2节"将相对引用解析为绝对形式",第6a项:
解释除了最后一段之外,基本URI的路径组件的所有部分都被复制到缓冲区。换句话说,在最后一个(最右边的)斜杠字符之后的任何字符(如果有的话)都将被排除。
在网页上,"Base URI"是页面地址,例如http://example.com/path/to/page.html
。相对链接,例如<a href="page2.html">
,必须被解释为基础URI的兄弟,因此page.html
被删除,page2.html
被添加,结果如预期的http://example.com/path/to/page2.html
。
Java URL
类实现了这个逻辑,这就是为什么你得到了你所看到的,这完全是它应该工作的方式。
它是通过设计,即不是一个错误。