转自:http://www.cnblogs.com/hust-ghtao/p/4724885.html

译者:华科小涛:http://www.cnblogs.com/hust-ghtao/:

初学http协议,就被这两个相似的术语搞蒙了,查了很多资料,总算搞清楚了。(找资料还是英文啊,靠谱。。。)。

本篇博客翻译自:https://danielmiessler.com/study/url_vs_uri/,是在是一片简单实用的好文,对帮我们弄清概念很有帮助:

译文:

一直存在很多技术上的争论,其中最为妙的恐怕就是web地址应该叫什么的问题。通常情况就是这样:有人把地址栏的内容叫“URL”,这时候有些人就来劲了:“不!其实那时URI。。。”

对于这种纠正的反应呢,通常也有这么几种情况,心眼小的就寻思这人赶紧走吧,淡定点的就耸耸肩表示同意,火气大的就拔刀相向了好不?

那这篇文章呢,就对这个只是提供一个简单的总结,毕竟互黑也要黑到点子上是吧。

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”这个术语正在被弃用。所以明智吧少年!

结语

If you don’t mind being “that guy”, URI is probably the more accurate term to use. But if you are in the linguist / “use what’s understood” camp, feel free to go with URL.

参考:

https://en.wikipedia.org/wiki/Uniform_Resource_Identifier

https://danielmiessler.com/study/url_vs_uri/

------------------------------------------------------华丽的分割线---------------------------------------------------------------------

转自:http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html

这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java Bean中定义一些字段,用来表示资源的位置,比如:imgUrl,logoUri等等。但是,每次定义的时候,心里都很纠结,是该用imgUrl还是imgUri呢?

同样的,另外一个问题:String HttpServletRequest.getRequestURI();和StringBuffer HttpServletRequest.getRequestURL();返回的内容有何不同?为什么会如此?

带着这些问题到网上去搜了下,没发现让自己看了明白的解释,于是,想到了Java类库里有两个对应的类java.net.URI和java.net.URL,终于,在这两个类里的javadoc里找到了答案。

URIs, URLs, and URNs

首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema必须被指定。

ok,现在回答文章开头提出的问题,到底是imgUrl好呢,还是imgUri好?显然,如果说imgUri是肯定没问题的,因为即使它实际上是url,那它也是uri的一种。那么用imgUrl有没有问题呢?此时则要看它的可能取值,如果是绝对路径,能够定位的,那么用imgUrl是没问题的,而如果是相对路径,那还是不要用ImgUrl的好。总之,用imgUri是肯定没问题的,而用imgUrl则要视实际情况而定。

第二个,从HttpServletRequest的javadoc中可以看出,getRequestURI返回一个String,“the part of this request’s URL from the protocol name up to the query string in the first line of the HTTP request”,比如“POST /some/path.html?a=b HTTP/1.1”,则返回的值为”/some/path.html”。现在可以明白为什么是getRequestURI而不是getRequestURL了,因为此处返回的是相对的路径。而getRequestURL返回一个StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的请求资源路径,不包括querystring。

总结一下:URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

注:这里的绝对(absolute)是指包含scheme,而相对(relative)则不包含scheme。

URI抽象结构     [scheme:]scheme-specific-part[#fragment]

[scheme:][//authority][path][?query][#fragment]

authority为[user-info@]host[:port]

参考资料:

http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html

http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

ps:

java.net.URL类不提供对标准RFC2396规定的特殊字符的转义,因此需要调用者自己对URL各组成部分进行encode。而java.net.URI则会提供转义功能。因此The recommended way  to manage the encoding and decoding of URLs is to use  java.net.URI. 可以使用URI.toURL()和URL.toURI()方法来对两个类型的对象互相转换。对于HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder来完成,但是对URL对象不适用。

分类: 技术点滴

URL和URI的区别相关推荐

  1. URL和URI的区别 【转】

    2019独角兽企业重金招聘Python工程师标准>>> URL和URI的区别 [转] 初学http协议,就被这两个相似的术语搞蒙了,查了很多资料,总算搞清楚了.(找资料还是英文啊,靠 ...

  2. 一招明白URL和URI的区别

    URL和URI的区别(示例): URL[统一资源定位器]: http://localhost:8080/api/account/queryAccountInfo URI[统一资源定位符]: /api/ ...

  3. 【转】URL和URI的区别

    [转]URL和URI的区别 译者:华科小涛:http://www.cnblogs.com/hust-ghtao/: 初学http协议,就被这两个相似的术语搞蒙了,查了很多资料,总算搞清楚了.(找资料还 ...

  4. 通熟理解urL和urI的区别

    转载自:https://blog.csdn.net/simplebam/article/details/72644094 关于URL和URI的区别,个人见解. 初学java,最近被一个概念搞得头晕脑胀 ...

  5. URL和URI 的区别

    对于很多刚入门web开发的程序员新人,相信都有过对URL和URI 区分困扰的时候,似乎两者是一体的.对于两者的区别,我当时也是处于糊里糊涂的状态.下面,来简明说明下区分两者的要点,扫清对他们的困扰. ...

  6. URN、URL、URI的区别

    三者关系: URI(Uniform Resource Identifier ):统一资源标识符,就是在某一规则下能把一个资源独一无二地标识出来. URL(Uniform Resource Locato ...

  7. url与uri的区别

    uri包含url,但并不是所有的uri都是url,url中一定要有协议,比如ftp, http, https等,如下图: 转载于:https://www.cnblogs.com/wlemory/p/5 ...

  8. 你知道URL、URI和URN三者之间的区别吗?

    这是一个经典的技术争论,许多人都会自问:URL.URI,很可能还有URN,它们之间的区别是什么.虽然,现在我们简单地把 URN 和 URL 都看做 URI,但严格来说URI可以进一步划分为URL.UR ...

  9. URI、URL和URN的区别和联系

    什么是URI.URL.URN? URI(Uniform Resource Identifier ):统一资源标识符.URI类似于资源的 id,一个URI能够标识唯一一份资源,但反之则未必. URL(U ...

  10. URL、URN与URI的区别与联系

    他们之间的区别 URI是互联网统一资源标识符,URL和URN是它的实现的一种方式,URL是通过资源位置路径来标记资源,URN是通过名字(命名空间字符串)来标记,URL和URN都是URI的子集 URI( ...

最新文章

  1. ajax实现自动刷新页面实例
  2. Stream Processing: Apache Kafka的Exactly-once的定义 原理和实现
  3. Echarts柱状图的点击事件
  4. 一步步带你做vue后台管理框架(三)——登录功能
  5. 文件上传漏洞——upload-labs(11-20)
  6. Apache Beam是什么?
  7. enum 有什么好处_高新技术企业认定四个核心评分标准是什么?软著能加分吗?...
  8. 【AD】AD19/20笔记及快捷键
  9. mybatis的trim标签
  10. 发现两个有趣的CSS3效果
  11. noip模拟赛 猜数字
  12. Messenger Group Redesign - 缓解群组社交压力设计思考
  13. appscan初次接触
  14. Java扫码点餐小程序源码 智慧点餐系统源码 点餐APP SaaS模式
  15. 计算机静音图标无法更改怎么办,声音图标没了不要着急,用金山毒霸2011进行修复 - 金山安全专题 - 声音图标没了怎么办? - 安全专题...
  16. 彻底解决mac os 下javac Java命令行工具乱码问题
  17. 数据分析面试都会问到哪些问题
  18. 命令行方式实现QQ自动登录
  19. 云桌面到底是干什么的?
  20. 拉普拉斯分布和拉普拉斯变换有什么区别

热门文章

  1. 基于springboot的房屋租赁系统
  2. html动画转换为桌面动态壁纸,怎么设置电脑动态壁纸-动态桌面,这个功能太好玩了...
  3. java调用mac终端命令_JAVA之前 - mac终端命令行
  4. sql server去空格函数LTRIM()RTRIM(),判断是否为空函数isnull(),以及获取字符串长度len()的使用方法
  5. python 区块链_python与区块链
  6. 国家统计局统计用区划代码和城乡划分代码---爬虫、详细分析
  7. ZOOM视频会议共享声音,Zoom共享屏幕播放视频卡顿,你学会了吗?
  8. 机器学习常用算法优点及缺点总结
  9. 基于深度学习的关系抽取
  10. pdf阅读,保存上次阅读位置