URIURL和URN是识别定位和命名互联网上的资源的标准途径本文分析了URIURL和URN和Java API的URI和URL类(以及与URL相关的类)并演示了如何在程序中使用这些类
年Tim BernersLee发明了互联网(World Wide Web)WWW被认为是全球互连的实际的和抽象的资源的集合它按需求提供信息实体通过互联网访问实际的资源的范围从文件到人抽象的资源包括数据库查询
因为要通过多样的方式识别资源(人的名字可能相同然而计算机文件只能通过唯一的路径名称组合访问)所以需要标准的识别WWW资源的途径为了满足这种需要Tim BernersLee引入了标准的识别定位和命名的途径URIURL和URN
URIURL和URN是什么?
体系中的URIURL和URN是彼此关联的URI的范畴位于体系的顶层URL和URN的范畴位于体系的底层这种排列显示URL和URN都是URI的子范畴如图所示
图URIURL和URN之间的层次关系URL和URN是URI的子范畴
URI表示的是统一的资源标识它是以某种统一的(标准化的)方式标识资源的简单字符串典型情况下这种字符串以scheme(命名URI的名字空间的标识符一组相关的名称)开头语法如下
[scheme:] schemespecificpart
URI以scheme和冒号开头Scheme用大写/小写字母开头后面为空或者跟着更多的大写/小写字母数字加号减号和点号冒号把scheme与schemespecificpart分开了并且schemespecificpart的语法和语义(意思)由URI的名字空间决定
其中一个例子是其中http是scheme//是 schemespecificpart并且它的scheme与schemespecificpart被冒号分开了
我们可以把URI按照绝对的或相对的分类绝对的URI指以scheme(后面跟着冒号)开头的URI前面提到的就是绝对的URI的一个例子其它的例子还有mailto:news:complangjavahelp和xyz://whatever你可以把绝对的URI看作是以某种方式引用某种资源而这种方式对标识符出现的环境没有依赖
如果使用文件系统作类比绝对的URI类似于从根目录开始的某个文件的路径与绝对的URI不同的相对的URI不是以scheme(后面跟着冒号)开始的URI
它的一个例子是articles/l你可以把相对的URI看作是以某种方式引用某种资源而这种方式依赖于标识符出现的环境如果用文件系统作类比相对的URI类似于从当前目录开始的文件路径
URI可以进一步分为不透明的和分层的两类不透明的URI指schemespecificpart不是以正斜槓(/)开头的绝对的URI
其例子有news:complangjava和前面的mailto:不透明的URI并不是用于分解的(超出了识别scheme的范畴)因为不需要验证schemespecificpart的有效性与它不同的是分层的URI可以是以正斜槓开头的绝对的URI或相对的URL
与不透明的URI不同分层的URI的schemespecificpart必须被分解为几个组成部分这些组成部分是什么?分层的URI标识组件的普通子集的schemespecificpart符合下面的语法
[//authority] [path] [?query] [#fragment]
可选的authority组件标识了该URI名字空间的命名机构如果有这一部分它就是以一对正斜槓开始的它可以是基于服务器或基于注册的并且它以后面的正斜槓问号或没有其它符号结束基于注册的授权机构组件有特定大纲的语法(本文没有讨论因为很少使用它)而基于服务器的授权机构组件的语法如下
[userinfo@] host [:port]
按照这种语法基于服务器的授权机构组件可以随意的以用户信息(例如用户名)开始后面跟着一个@符号紧接着是主机的名称以及冒号和端口号例如:就是一个基于服务器的授权机构组件其中jeff包含了用户信息包含了主机包含了端口
可选的path组件根据授权机构组件(如果提供了)或大纲(如果没有授权机构组件)识别资源的定位(或位置)路径(path)可以分成一系列的路径片断(path segment)每个路径片断使用正斜槓与其它的路径片断隔开
如果路径的第一个路径片断以一个正斜槓开始该路径就被认为是绝对的否则路径就被认为是相对的例如/a/b/c由三个路径片断ab和c组成了一个路径此外这个路径是绝对的因为第一个路径片断(a)的前缀是正斜槓
可选的query组件识别要传递给某种资源的数据这种资源使用该数据获取或生成其它的传递回调用者的数据例如 x=y就是一个查询(query)在这个查询中x=y是传递给某种资源的数据x是某种实体的名称y是该实体的值