什么是 URI/URL/URN ?
最初认识RESTful,读者可能对URI/URL/URN三个概念不是很清楚,这里简单对比一下,首先读者必须清楚一件事情:URL和URN都是URI的子集 ,换言之URL和URN都是URI,但反过来说就不成立,它们的结构如下:
URI的全称是Uniform Resource Identifier,它是“统一资源标识符”,在整个互联网上所有的访问地址都抽象成了资源 ,这些资源拥有唯一的标识符,我们通过该标识符来访问资源,这个标识符就是URI。而URI在表述资源时分离成了两个子类型,一个就是我们常听到的URL,而另外一个就是URN。
URL和URI名字相近,它的全称是Uniform Resource Location ,意思是:“统一资源定位符”,我们通常可以通过URL来准确定义一个资源的位置,如:http://localhost:8080/user/1。它主要包含几部分:
- http:协议名称,在RESTful中常用的是http/https协议,而互联网上还可以使用ftp、stmp等各种协议。
- localhost:主机的域名,这个域名可以是IP地址,如:10.0.0.100这种格式。
- 8080:端口号,如果互联网上的URL不带端口号,就使用默认端口:80,如:http://localhost/user/1,这种格式使用80端口。
- 后边的/user/1就是当前访问资源的名称,它精确定位了所访问资源的路径。
有一点需要注意,在RESTful中通常会使用类似:/user/:id 来定义一个Api,它使用不同的参数来读取不同的用户信息,这种情况下:/user/1 和 /user/2 表示两个URI,而不是一个,而您后端的程序逻辑可能定义的是一个。
URN,最后谈谈URN,它的全称是Uniform Resource Name ,意思是:“统一资源名”,那么它有什么作用呢?实际上URN比URL更方便去定位资源,它只需要知道一个域名就可以了,直接隔离了资源本身所在的位置。换句话说,如果你把资源从host1切换到host2 ,这种情况下使用URL的话是需要变更访问地址的,如果是直接使用URN,那么名称不变就可以不用做任何操作,程序依旧会访问URN背后映射的真实资源地址。URN可以用来解决一些与资源位置相关的问题,例如资源被移动或者替换时,URN可以保持不变,从而避免了链接失效的问题。URN的通用语法如下:
< URN > ::= “urn:” < NID > “:” < NSS >
其中NID是命名空间标识符,NSS则是标识命名空间的特定字符串,可以当做唯一名称。