URI, URN 和 URL

01-11 20:30 Tristan 首页 程序猿修炼笔记

发了两天关于算法的笔记,今天还是回归一下web好了~在几天前的文章中我简要介绍了一下网络中关于客户端、服务器和http协议的一些解释,今天呢,我们就接着这个网络话题继续展开,介绍一下我们平时上网时经常遇到的又一大概念——URI。


相信我,URI这个东西大家绝对对它很熟悉,只不过可能有些人不知道它叫做URI罢了。URI的全称叫做“统一资源标志符(Uniform Resource Identifier)”,从名字上看大家就能猜到他是干嘛的了——标注资源。在上一篇关于网络的笔记中我也提到了,网络上的服务器中储存的一些文件也好,图片也罢,他们都被统称为“资源(Resource)”,我们平时上网的过程,就是向服务器请求这些资源的过程,比如刷个微博,或者抢个春运火车票什么的。


网络上的资源数目何止亿万,对于这么多的资源我们总要有个方式来区分他们吧,就像是每个人都有一个住址,你要找这个人就要按照住址上的XX国XX省XX市去找。同理我们向网络请求资源的时候也要有一个URI当标识符,告诉服务器你要请求什么资源。相信大家看到这已经猜到为什么我说URI每个人都很熟悉了,不妨回想一下,你们打开浏览器上网的时候,第一件事情是做什么?输入网址对吧,不同的网址对应不同的网页,也就是不同的网络资源。这个网址实际上就是URI,更确切的说,应该是URL。


URL(Uniform Resource Locator),中文名叫做“统一资源定位符”,它是URI的一种,也就是说它属于URI。除了URL之外,URI还有另一个种类,叫做URN(Uniform Resource Name),也就是“统一资源名称”。总而言之,URI说一种标准,而URL和URN是对这种标准的具体实现(懂编程的同学不妨把URI想象成一个抽象类)。他们三个之间的关系可以用下面这个图来表示:


我们就从最常用的URL开始说起好了,URL的做法就是通过描述资源所在的地址来锁定资源。我们平时上网输入的网址可能是这个样子:http://www.w3schools.com/sql/default.asp。我们来具体看一下它的各个部分:

1、“http://”。这部分叫做“scheme”(不知道怎么翻译好,大家自己体会一下)它描述的是“怎样”来获取你想要的这个资源。这个例子里面用到的就是我们上篇文章里说到的http协议,意思就是说通过http协议来传输这个资源。

2、“www.w3schools.com”。这部分叫做“host”(翻译成“主机”好了),它描述的是“去哪里”来获取这个资源。上面例子指定的是到“www.w3schools.com”这个地址来获取。

3、“/sql/default.asp”。这部分叫做“path”(路径),它描述的是在这里“获取什么”。这里的意思就是获取一个叫“sql”文件夹下面的一个叫“default.asp”的文件。


当然,如果我们在浏览网页时随便注意一下浏览器的地址栏,我们可能会发现这里面的URL远比我举的这个例子复杂,就比如我现在写这篇笔记时,地址栏里面是“https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10&appmsgid=677874496&token=1433042311&lang=zh_CN”。事实上根据采用的协议的不同,URL的形式也会有些许差别。不过总的来说还是有相似之处的,总结起来,URL的通用形式应该是下面这个样子:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

1、scheme

填写使用的协议名,如http,https,ftp,rtsp等。

2、user和password

在登录一些服务器等时候可能需要提供用户名和密码,这个时候就把他们相应地填写到user和password等位置。如果服务器需要提供,但是你没填,那么这里就会被自动加上默认到用户名和密码。

3、host

填写主机地址,可以是域名(Domain Name),也可以是IP地址。比如www.w3schools.com,或者103.235.46.39。

4、port

填写端口号,在http中一般默认端口号是80,如果是默认的就不用填写(当然写上也行)。

5、path

填写路径。这部分就和我们平常用的电脑里面的文件系统很相似,比如/sql/default.asp。

6、params

填写参数。有些时候在我们获取资源时,不仅要指定资源的位置,还要对资源如何传输等一些细节做规定,这时候这些细节就会写在params这个位置。参数可以有多个,他们之间用分号(;)隔开。例如:ftp://prep.ai.mit.edu/pub/gnu;type=d,这里指定“type”参数等值为“d”。这里值得一提的是,参数不是只能加在path的最后一部分,其实每一部分都可以加,比如:http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true,这里加粗的部分都是参数。

7、query

填写查询字段。当我们使用例如搜索引擎之类的东西时,要给它一定的信息,比如搜索关键字是什么,搜索范围是什么等等。这时候这些信息就会写在query这个位置,如果有多个查询字段,他们之间用“&”隔开。例如http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue。

8、frag

最后这一个叫做fragment的部分是不会传递给服务器的,因为它的作用是用来标识一个资源里面的某个部分。比如一瓶很长文章里面的一个章节,或者是一个很大的网页里面的一张图片。服务器只接收出了fragment之外的部分,然后把整个资源返回给你。这样你的程序例如浏览器就可以根据fragment的值来显示这个资源的特定位置。


关于URL再说最后一点,有时候我们会看到URL里面有一堆像乱码一样的东西,其实他们只不过是一些符号被转义了而已。比如%7E表示符号“~”,%20表示空格等。


URL作为资源等定位符很有用,不过它也有一些缺陷。URL说白了是资源的地址,而不是那个资源本身。这样的话,如果把那个资源换换地方,你再用原来的地址就找不到它了。比如原来是sql文件夹下的一个文件叫index.html,你可以用“/sql/index.html”来找,如果你把这个index.html移到其他文件夹下,那原来这个地址就找不到了。为了解决这个问题,我们就要引入了另一种标注方式URN了。


不同于URL的是,URN不是通过一个资源的地址来标注这个资源,而是通过给这个资源起一个名字。有了这个名字之后,我们想获取它的时候就不必再制定它的地址,只需要指定它的名字。这样以来不管资源怎么移动,我们都可以用它原来的名字来找到它。甚至有可能这个资源本身就有很多个备份存在不同的服务器上,只要指定名字,就可以从任意一个服务器上获取。


URN的格式要比URL简单的多,是这样的:urn:<NID>:<NSS>。其中NID是命名空间,NSS就是它的名字。例如urn:isbn:0451450523表示一本书。相比于URL来说,用到URN的机会就少的多了,因此我也就没有过多的研究URN了。如果大家对URN比较感兴趣,不妨自己寻找一下资料~


首页 - 程序猿修炼笔记 的更多文章: