【问题标题】:Why URL constructor does not allow relative URL?为什么 URL 构造函数不允许相对 URL?
【发布时间】:2019-01-07 10:00:39
【问题描述】:

URL 构造函数不允许丢失或未知协议。

但这不支持广泛使用的相对 URL,如

  1. 根相对 URL <img src="/images/pic.png>
  2. 页面/基本相对 URL <img src="images/pic.png>

为什么在这些非常常见的情况下 URL 构造函数会抛出 java.net.MalformedURLException: no protocol?

URI 构造函数支持这样的相对 URL。

顺便说一句,说“相对 URI”而不是“相对 URL”是否正确?因为互联网上 99% 的所有链接都是“相对 URL”,而不是“相对 URI”

【问题讨论】:

  • 查看java.net.URL 和java.net.URI 的文档。
  • 是的,很高兴看到它。知识:)

标签: java url uri


【解决方案1】:

为什么URL 构造函数抛出java.net.MalformedURLException:在这些非常常见的情况下没有协议?

因为这些不是有效的 URL。

URI 构造函数支持此类相对 URL。

不正确。它允许相对 URIs。

顺便说一句,说“相对 URI”而不是“相对 URL”是否正确?因为互联网上 99% 的所有链接都是“相对 URL”,而不是“相对 URI”。

没有。不正确1.

URI 和 URL 的规范清楚地表明“相对 URL”不是有效的术语。见https://www.rfc-editor.org/rfc/rfc3986

URI 和 URL 的 Java API 的设计者选择(明智的 IMO)正确使用术语;即根据各自的规范。这就是URL 构造函数不接受相对 URI 字符串作为参数的原因。


1 - 将蚂蚁称为“虫子”并不正确。真正的虫子是半翅目,它是昆虫纲(昆虫)的一个目,其特点是有吸嘴部分。蚂蚁是膜翅目的成员。正如维基百科所说:“许多通常被称为“虫子”的昆虫属于其他目;例如,lovebug 是苍蝇,而 May 虫和瓢虫是甲虫。”(参见 Wikipedia)我的观点?如果 Java 设计者滥用了 URL / URI 的区别,那他们就像生物学家在科学论文中将蚂蚁称为“虫子”一样糟糕。

【讨论】:

    【解决方案2】:

    为什么 URL 构造函数会抛出 java.net.MalformedURLException: no 这些非常常见的情况下的协议?

    据documentation:

    抛出表示出现了格式错误的 URL。要么不合法 协议可以在规范字符串中找到,或者该字符串可以 不被解析。

    示例 1: "https://stackoverflow.com/something/java/something" -> 会抛出错误

    示例 1.1: https://stackoverflow.com/something/java/something -> 不会抛出错误。

    简单的意思是->例子1:没有在字符串内部解析。,所以去掉""。

    URIs identify 和 URLs locate;但是,定位器也是标识符,所以每个 URL 也是一个 URI,但有些 URI 不是 URL。

    一个暴露的维恩图:( URIs ( URLs ) )

    上面的维恩图暗示:URL 比 URI 更具体。

    【讨论】:

      【解决方案3】:

      一个 URL 由不同的部分组成,例如该主机上的协议、主机和资源。

      相对 URI 不包含用于创建 URL 的所有信息,因此它会引发 java.net.MalformedURLException。

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 2015-06-06
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        相关资源
        最近更新 更多