URI & URL & URN 的关系

URI & URL & URN 的关系

很长一段时间以来,我都搞不清楚URI,URL的关系,最近养成了写博客的习惯,那么我们就来一起搞搞明白。

如果有和我一样搞不清楚的师傅,我只能说这不怪我们,首先这两个玩意儿长的很像,很容易就搞混,因此在本文中将全部采用大写的形式加以区分。

其次就是我到目前为止的一个观点,由于中文过于博大精深,导致很多翻译过来的内容变得非常绕口难懂,同时掺杂着一些不恰当的比喻,导致了这些概念之间的关系变得非常模糊。

URI

URI, Uniform Resource Identifier, 统一资源标志符

“统一”,表示使用一种统一的规范来表示

“资源标识符”,表示URI是用来指代一种资源,网页,图片,视频,etc..

下面是URI的统一格式规范,依次由五个部分组成

URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]

其中Authority可以划成三个子模块

authority = [userinfo "@"] host [":" port]

具体的各个组成模块大家可以去Wikipedia一个个检查过来

我们用一个例子结束这个章节: https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top

相信这个也是大多数人常见的一个UR*的例子,那么大家也会好奇那么URL应该长什么样的?我们接着来看

URL

URL, Uniform Resource Locator, 统一资源定位符

和之前一样,我们从其名字出发来解释URL的作用

“统一”,同样,表示使用一种统一的规范来表示 “资源定位符”,表示URL需要帮助找到一个资源所在的位置,使用用户能够获取到这个资源

那它究竟应该长什么样呢?

和我们以前提到的格式一模一样,这就是一个URL:https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top

先别急着糊涂,我们先仔细看这张图,我们可以发现,有很多可选项,作为一个URL虽然也使用同样的语法规范,但是和它的名字一样,它需要一切能够指示一个资源位置的可选项

反过来说,URI,只需要能够代表这个资源的名称就可以了,不需要完成指示的工作,因此可以选择很少的选项,那么一旦完成了指示资源位置的任务,一个URI也可以被叫做URL

也就是说:

  • URI包含URL,
  • URI是URL的父类
  • 一个能指示资源位置的URI也被叫做URL
  • 一个URL一定是一个URI
  • 一个URI不一定是一个URL,它还可以是URN

我们最后用一个Java Web中的例子来结束URI与URL的区分

我们重写Servlet的doGet方法来帮助服务器处理来自客户端的HTTP请求,并通过HttpServletRequest对象来获取GET请求的具体信息

接着通过getRequestURI() & getRequestURL()来分别获取请求的URI以及URL的信息

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("URI of the requested resource: " + request.getRequestURI());
    System.out.println("URL of the request resource: " + request.getRequestURL());
}

结果如下,我们可以看到,URI可以非常简短,工程名+资源的路径即可,而URL就需要完整的ip:port的信息来帮助唯一定位一个资源

URI of the requested resource: /JSPLearn/hello
URL of the request resource: http://localhost:8089/JSPLearn/hello

URN

URN, Uniform Resource Name, 统一资源名称,是一种特殊的URI,特点是其scheme使用 urn:

“统一”,表示使用一种统一的规范来表示 “资源名称”,表达了URN会表示一个资源的名称,并称这个标识会同时在空间以及时间上保持其唯一性,及全球唯一,并且在未来也会保持唯一

其与URI和URL的区别就在于其在时空上的唯一性,以及其并不能用来定位一个资源

Appendix

URI scheme

URI scheme也就是所有URI的第一部分,很多中文的翻译将其称作“协议”,但我总觉得有点怪怪的,因为如果是协议的话我们一般会用protocol,但是看到ftp,http又觉得无法反驳,直到我们看到了一个StackExchange上的回答:

“It simply tells you how to interpret the part of the URL after the colon. … This isn’t identical to a protocol, because there is no transport layer or encoding”

URI scheme仅仅是告诉浏览器应该如何去解析后面的内容,例如 file: 就表示后面的是我们需要访问的本地资源的目录, http: 就表示需要用后面的路径来发起HTTP连接。

Reference

What is the difference between a URI, a URL and a URN?

Uniform Resource Identifier

URL

Uniform Resource Name

What is a URI Scheme?

Licensed under CC BY-NC-SA 4.0
Last updated on Sep 17, 2022 16:03 CST
comments powered by Disqus
Cogito, ergo sum
Built with Hugo
Theme Stack designed by Jimmy