URI (uniform resource identifier)统一资源标志符;
URL(uniform resource location )统一资源定位符(或统一资源定位器);
URN(uniform resource name )统一资源命名。
首先我们知道Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 -都 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。
那这个URI到底是什么呢?
在最高级别上,字符串形式的 URI 引用(以下简写为 "URI")语法如下
[scheme:]scheme-specific-part[#fragment] URI一般由三部分组成:
一.访问资源的命名机制。 典型情况下,这种字符串以scheme(命名URI的名字空间的标识符——一组相关的名称)开头, URI以scheme和冒号开头。Scheme用大写/小写字母开头,后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把 scheme与scheme-specific-part分开了,并且scheme-specific-part的语法和语义(意思)由URI的名字空间 决定。如下面的例子: http://www.cnn.com,其中http是scheme,//www.cnn.com是 scheme-specific-part,并且它的scheme与scheme-specific-part被冒号分开了。
二.主机名( 存放资源的主机名。)+相对URI(资源自身的名称,由路径表示。)这里的主机名与相对路径都包含在scheme-specific-part中。 参考下面的URI,它符合当前的RFC4395规范: 协议名称://域名.根域名/目录/文件名.后缀 例如http://b.c/d/e.f (假设b.c是一个可用的域名,e.f是一个标准的文件) 这个URI是这样的:这是一个可通过HTTP协议访问的资源,位于主机b.c上,通过URI中的字符串“/d”访问主机上的“d”文件夹,通过“e.f”请求访问主机上“/d/e.f”这个文件。(再通俗一点的例子便是:http://www.baidu.com/d/e.f 这里的www.baidu.com便是上面的b.c,即可以理解为主机名) 这是URI的另一个例子,指向一个用户的邮箱:mailto:名称@域名 注:大多数读者可能熟悉"URL",而不是URI。URL是URI命名机制的一个子集。
相对URI不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相对URI可能含有相对路径(如,“..”表示上一层路径),还可能包含片段标志符。 为了说明相对URI,假设我们有一个基本的URI: 协议://域名/目录a/ 下面的链接中使用了相对URI: ../文件D 它扩展成完全的URI就是 "协议://域名/目录a/文件D", 下面是一个图像的相对URI: <IMG src="../icons/logo.gif" alt="logo"> 它扩展成完全的URI就是 "协议://域名/目录a/icons/logo.gif"。 在HTML中,URI被用来: 链接到另一个文档或资源。 链接到一个外部样式表或脚本。 在页内包含图像、对象或applet。 建立图像映射。 提交一个表单。 建立一个框架文档。 引用一个外部参考。 指向一个描述文档的metadata。 三.标志符 有的URI指向一个资源的内部。 这种URI以"#"结束,并跟着一个anchor标志符(称为片段标志符)。例如,下面是一个指向section_2的URI: 协议://域名/目录/文件#片段标示符(例如:/a/b.php#a) 例如: http://java.sun.com/index.html#chapter1 从技术角度来讲,后面会讲到的URL 并不需要包含此片段。但是,使用此片段的目的在于表明,在获取到指定的资源后,应用程序需要使用文档中附加有 chapter1 标记的部分。标记的含义特定于资源。
URI有绝对和相对之分,绝对的URI指以scheme(后面跟着冒号)开头的URI。前面提到的http://www.cnn.com就是绝对的URI 的一个例子,其它的例子还有mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz: //whatever。你可以把绝对的URI看作是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。 与绝对的URI不同的,相对的URI不是以scheme(后面跟着冒号)开始的URI。例如前面“d/e.f”(注意若在相对路径头加多一个“/”即变成类似文件系统的绝对路径),你可以把相对的URI看作是以某种方式引用某种资源,而这种方式依赖于标识符出现的环境。
简单来说,URI就是以某种统一的(标准化的)方式标识资源的简单字符串。只是一段字符串!!!用各种具体标准来进行描述某个资源,但不具备获取资源的能力,而URL是URI的一个子范畴,这个URL不但只可以描述这个资源,还可以得到该资源中的内容
作为URI的特例URL当然具备URI的格式,但不同在于,URI允许为绝对路径或相对路径,但URL必须为绝对路径,即必须得有协议头等信息,并且URL类可以对该资源进行操作。
URL的格式由下列三部分组成: 第一部分是协议(或称为服务方式); 第二部分是存有该资源的主机IP地址(有时也包括端口号); 第三部分是主机资源的具体地址。,如目录和文件名等。 第一部分和第二部分之间用"://"符号隔开,第二部分和第三部分用"/"符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。 URL地址格式排列为:scheme://host[:port]/path,例如http://www.sohu.com/domain/HXWZ就是一个典型的URL地址。
譬如我们上网的时候输入的网址,我们可以认为这个网址是URI,也可以认为它是URL,因为对于人而言,这只是一个地址罢了,但对于浏览器而言,为了给你显示该网址的内容,浏览器必须对该网址所指定的资源进行读取并下载到浏览器呈现给我们,对于浏览器而言这个网址是URL。 那么我们在定义一个资源的时候应该是URI还是URL呢,答案是得看情况,倘若你的地址中为绝对路径,则可以使用URL,倘若为相对路径,则不可以为URL,而URI则没这些限制,更何况,体系中的URI、URL和URN是彼此关联的。可以通过一定的方法转换。 URI的范畴位于体系的顶层,URL和URN的范畴位于体系的底层。这种排列显示URL和URN都是URI的子范畴
再有,由于URL为URI的一个子范畴,我们经常在对网址进行操作时往往是getURI()而非getURL(),譬如,在Web中一个请求中,比如“POST /some/path.html?a=b HTTP/1.1”,则应返回的值为”/some/path.html”,故为getURI更妥善。
在网上找到几个好的参考: http://blog.csdn.net/eagle51998/article/details/372052 http://baike.baidu.com/link?url=kl82hJDyOcaqnVqkTVgv74-ov_mmVMLTXcLix-VPbXRvc4YSgGVuO2AsKsWogf5l http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html http://www.blogjava.net/flysky19/articles/93379.html
|