URL和URI区别

来源:互联网 发布:游戏编程要看哪些书 编辑:程序博客网 时间:2024/06/05 00:20

URI,URL,URN的关系图

URI,URL,URN

从上面的那幅图可以看出来,一共有三个不同的概念URI,URL,URN。这讨论这样的问题时,最好的方法就是回到原点啊,这里我们在RFC 3986: Uniform Resource Identifier (URI): Generic Syntax里面收集了点资料:

“A Uniform Resource Identifier (URI) 是一个紧凑的字符串用来标示抽象或物理资源。”

“A URI 可以进一步被分为定位符、名字或两者都是. 术语“Uniform Resource Locator” (URL) 是URI的子集, 除了确定一个资源,还提供一种定位该资源的主要访问机制(如其网络“位置”)。“

那我们无所不知的维基百科把这段消化的很好,并描述的更加形象了:

“URI可以分为URL,URN或同时具备locators 和names特性的一个东西。URN作用就好像一个人的名字,URL就像一个人的地址。换句话说:URN确定了东西的身份,URL提供了找到它的方式。”

通过这些描述我们可以得到一些结论:

首先,URL是URI的一种(通过那个图就看的出来吧)。所以有人跟你说URL不是URI,他就错了呗。但也不是所有的URI都是URL哦,就好像蝴蝶都会飞,但会飞的可不都是蝴蝶啊,你让苍蝇怎么想!
让URI能成为URL的当然就是那个“访问机制”,“网络位置”。e.g. http:// or ftp://.。
URN是唯一标识的一部分,就是一个特殊的名字。
  下面就来看看例子吧,当来也是来自权威的RFC:

ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
mailto:John.Doe@example.com (also a URL because of the protocol)
news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
tel:+1-816-555-1212
telnet://192.0.2.16:80/ (also a URL because of the protocol)
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
  这些全都是URI, 其中有些事URL. 哪些? 就是那些提供了访问机制的.
总结
下面到了回答问题的时候了:
当我们替代web地址的时候,URI和URL那个更准确?
基于我读的很多的文章,包括RFC,我想说URI更准确。
别急,我有我的理由:

我们经常使用的URI不是严格技术意义上的URL。例如:你需要的文件在files.hp.com. 这是URI,但不是URL–系统可能会对很多协议和端口都做出正确的反应。

你去http://files.hp.com 和ftp://files.hp.com.可能得到完全不同的内容。这种情况可能更加普遍,想想不同谷歌域名上的不同服务啊。

所以,用URI吧,这样你通常技术上是正确的,URL可不一定。最后“URL”这个术语正在被弃用。所以明智吧少年!

参考:
https://en.wikipedia.org/wiki/Uniform_Resource_Identifier
https://danielmiessler.com/study/url_vs_uri/

以下内容转自知乎:
作者:郭无心
链接:https://www.zhihu.com/question/21950864/answer/66779836

从JDK1.5开始,java.net包对统一资源定位符(uniform resource locator URL)和统一资源标识符(uniform resource identifier URI)作了非常明确的区分。
(1)URI是个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。URL是URI的一个特例,它包含了定位Web资源的足够信息。
其他URI,比如mailto:cay@horstman.com 则不属于定位符,因为根据该标识符无法定位任何资源。
URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
URI 和 URL 概念上的不同反映在此类和 URL 类的不同中。 此类的实例代表由 RFC 2396 定义的语法意义上的一个 URI 引用。URI 可以是绝对的,也可以是相对的。
对 URI 字符串按照一般语法进行解析,不考虑它所指定的方案(如果有)不对主机(如果有)执行查找,也不构造依赖于方案的流处理程序。相等性、哈希计算以及比较都严格地根据实例的字符内容进行定义。换句话说,一个 URI 实例和一个支持语法意义上的、依赖于方案的比较、规范化、解析和相对化计算的结构化字符串差不多。
作为对照,
URL 类的实例代表了 URL 的语法组成部分以及访问它描述的资源所需的信息。
URL 必须是绝对的,即它必须始终指定一个方案。
URL 字符串按照其方案进行解析。
通常会为 URL 建立一个流处理程序,实际上无法为未提供处理程序的方案创建一个 URL 实例。相等性和哈希计算依赖于方案和主机的 Internet 地址(如果有);没有定义比较。
换句话说,URL 是一个结构化字符串,它支持解析的语法运算以及查找主机和打开到指定资源的连接之类的网络 I/O 操作。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。因此URL类只能作用于那些 Java类库知道该如何处理的模式,例如http:,https:,ftp:,本地文件系统(file:),和Jar文件(jar:)。

URI—Universal Resource Identifier通用资源标志符Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的。
URI一般由三部组成:
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。
URL—Uniform Resource Location统一资源定位符URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的 Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。 URL一般由三部组成: ①协议(或称为服务方式) ②存有该资源的主机IP地址(有时也包括端口号) ③主机资源的具体地址。
如目录和文件名等应用: 一 、 URI 比如在JDK中sun公司提供的简易HttpServer实现中public void handle(final HttpExchange exchange)throws Exception方法中,根据exchange对象可以拿到访问Http请求的URI对象。
ps:http://127.0.0.1:8080/cmd_helloworld/?name=guowuxin
此时URI uri = exchange.getRequestURI();
通过uri可以拿到连接的各部分内容:
uri.getPath() ——————–> /cmd_helloworld 注意有斜杠
uri.getQuery()———————-> name=guowuxin
当然如果是post请求,请求内容在请求body当中。

二、 URL 上面说了,URL 是一个结构化字符串,它支持解析的语法运算以及查找主机和打开到指定资源的连接之类的网络 I/O 操作。重要的,URL不仅仅可以进行语法解析运算,还可以查找主机,并且打开指定资源的连接进行网络IO操作。介绍URL类的两个重要方法:openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

URL url = new URL("http://www.baidu.com");InputStream in = url.openStream();ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = in.read(buffer)) != -1){   output.write(buffer, 0, len);}System.err.println(new String(output.toByteArray()));

上面的程序通过openStream()方法获取访问URL获取的输入流,从而读取响应内容,ps响应内容是过滤掉响应头了的。openConnection()方法就可以getOutputStream()以及 getInputStream()可以更灵活的进行request和response。

如果上面的解释还不是太明白,可看看下面来自知乎的“西毒”对其的理解,个人认为相比更容易理解。
链接:https://www.zhihu.com/question/21950864/answer/19833802

从鄙人程序员的角度理解,URI属于URL更高层次的抽象,一种字符串文本标准。就是说,URI属于父类,而URL属于URI的子类。URL是URI的一个子集。
在《HTTP权威指南》一书中,对于URI的定义是:统一资源标识符;对于URL的定义是:统一资源定位符。
二者的区别在于,URI表示请求服务器的路径,定义这么一个资源。而URL同时说明要如何访问这个资源(http://)。
例如,一个URL通常包括三部分:
方案部分(scheme):http://
地址部分:www.abc.com
资源部分:/1.png

而在C#中,URL类属于System.Security.Policy命名空间,Uri属于System。
在MSDN对Url类的备注中,能更好的说明Url与Uri的区别:Url 证据的存在将在授予集内生成 UrlIdentityPermission。如果有对 UrlIdentityPermission 的 Demand,则与 Url 证据对应的 UrlIdentityPermission 将与请求的权限进行比较。
考虑完整的 URL,包括协议(HTTP、HTTPS、FTP)和文件。例如,Microsoft Home Page 就是一个完整的 URL。
URL 可以精确匹配,也可在最后一个位置使用通配符来匹配。例如,Microsoft Home Page* 就是一个含通配符的 URL。
而Uri类在实例化的时候,可以指定为绝对路径,相对路径,但可以不指定到具体的某个资源。
那么我理解的二者的区别就是:URI可以表示一个域,也可以表示一个资源。URL只能表示一个资源。
同样的,URN(统一资源名称)也是URI的一个子集,目前没有大规模运用。
PS:
URI是一个字符串格式规范 并没有指定它的用途URL是资源定位的规范,包括网址、ftp服务器、文件路径。

原创粉丝点击