【问题标题】:java.net.URL bug in constructing URLs?java.net.URL 构建 URL 的错误?
【发布时间】:2015-10-26 16:58:58
【问题描述】:

构造new URL(new URL(new URL("http://localhost:4567"), "abc"), "def") 产生(恕我直言不正确)这个网址:http://localhost:4567/def

虽然构造 new URL(new URL(new URL("http://localhost:4567"), "abc/"), "def") 产生正确的(我想要的)url:http://localhost:4567/abc/def

区别在于 abc 构造函数参数中的尾部斜杠。

这是预期行为还是应该在 URL 类中修复的错误?
毕竟,当你使用一些帮助类来构建 URL 时,不要担心斜杠。

【问题讨论】:

  • 声称 SDK 中经过良好测试的类存在错误通常是相当大胆的声明。
  • 我没有要求任何东西。只是要求解释这种行为。
  • 好吧,您可能想查看URL 类资源,看看是否有任何帮助。很可能不是错误,即使它没有按您希望的方式工作。
  • @Kayaman 在查看源代码之前,最好先阅读 javadoc,因为它描述了预期的行为。这里看到的结果正是 javadoc 中描述的行为。
  • @Andreas Going to the source 除了代码中任何可能的隐藏 cmets 外,还向您显示了 javadoc;)

标签: java url construction


【解决方案1】:

引用new URL(URL context, String spec)的javadoc:

否则,该路径将被视为相对路径并附加到上下文路径,如 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 类实现了这个逻辑,这就是为什么你得到你所看到的,这完全是它应该工作的方式。

这是设计使然,即不是错误。

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 2016-01-25
    • 2012-04-05
    • 2011-11-21
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多