所有东西都有一个标准化的名字,以帮助人们寻找城市中的各种资源。书籍有ISBN号,公交车有线路号,银行账户有账户编码,人有身份证,街道有街道名称。人们告诉图书馆管理员书籍的ISBN号,他即可找出该书籍的位置。所有人都对这些名字的标准达成了一致,所以能方便地分享生活中的无尽资源。同样因特网充满无尽资源,一条微博,想与朋友分享时,仅仅将此链接告知对方即可。一条微博是资源,一条链接可快速准确找到此资源。因特网拥有一种机制去唯一标识这些资源!此机制就是URI。URI不仅统一因特网资源的标准化名字,而且标记这些资源的位置。URI的两种表现形式:URL和URI。URL是通过描述资源的位置来标识资源的;而URN则是通过名字来识别。Http协议处理的仅是URL。所以下面主要讲述URL,以URL是什么->URL的组成部分->URL的类型->URL的使用编码流程讲述URL。

URI,URL,URN是什么

  URI标识一个资源,URI是抽象的。可以理解URI为Java的接口,定义标识资源的一种行为。URL和URN实现了URI这个接口。URL通过位置来标识资源,而URN通过名字来标识资源。例如乔布斯是URI,它不是URL,因为它不能告诉你任何关于他的位置或如何找到他的信息,而且这个名字在美国可能有很多;美国xxx街xxx号的乔布斯是URL;乔布斯是个名字,但在全世界有很多乔布斯,不能通过此名字标识这个人,故乔布斯不能说是URN,URN严格约束了名字的唯一性,身份证号可认为是URN。

URL的组成部分

  前面说到URL可以通过位置来标识资源,那URL如何标识资源?URL的组成部分告诉客户端如何访问资源。它包括三个部分,scheme告知客户端怎样访问资源;host告知客户端资源的位置;path告知客户端位于host的特定的资源。以你去拜访朋友为例,你去朋友家的交通方式是scheme,朋友家为host,朋友为path。URL的通用格式为:<scheme>://[user][:][password][@]<host>:<port>[/][path];[params][?][query][#][frag],<>必须包含,[]可不包含。例如,http://www.cnblogs.com/lijianwen/admin/EditPosts.aspx?postid=22#f,http为scheme;www.cnblogs.com为host;lijianwen/admin/EditPosts.aspx为path;postid=22为query;#f为frag

URL的类型

  URL有两种类型:相对URL与绝对URL。绝对URL中包含有访问资源所需的全部信息,例如,http://www.cnblogs.com/lijianwen/admin/EditPosts.aspx;而相对URL是相对于基础URL来补充剩余的信息。例如,EditPosts.aspx,./EditPosts.aspx的基础URL是http://www.cnblogs.com/lijianwen/admin/。

URL的使用

  URL要统一因特网所有的资源,需要解决可移植性和安全性问题。可移植性意味着要支持各国语言,安全性意味着不能丢失信息。对URL进行编码很好的解决这两个问题。例如Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。RFC规定,URL只能使用英文字母、阿拉伯数字和某些标点符号($-_.+!*)以及某些保留字(:/?#[]@!$&’()*+,;=)。如果使用其他文字和符号就需编码。但问题是,RFC没有规定具体的编码方法,而是交给客户端(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。下面就让我们看看,“URL编码”到底有多混乱。中文Windows环境下,假如直接在浏览器的地址栏输入URL:http://www.charset.cn/中国.html?kw=中国。PATH为中国.html,参数未kw=中国。

  • IE中默认发送的URL的PATH部分是UTF-8编码,参数部分是GBK编码
  • FireFox中默认发送的URL的PATH和参数都是GBK编码
  • Opera中默认发送的URL的PATH和参数都是UTF-8编码
  • get/post请求各种浏览器又会有不同的编码方式。

面对如何混乱的领域,就衍生了乱码问题。后续文章会讲述乱码问题。

Http协议-URI和资源的更多相关文章

  1. REST = HTTP动词(GET POST PUT DELETE)操作 + 服务器暴露资源URI,最后返回状态码(充分利用HTTP自身的特征,而不仅仅是把HTTP当作传输协议。Rest协议是面向资源的,SOAP是面向服务的),表现形式可以是JSON XML BIN,举例很清楚

    好处是,操作系统或者浏览器,可以重复利用它们内置的缓存机制等等. 增删改查都是一个地址,具体靠http头部信息判断. 利用HTTP协议语义构建的语义化.可缓存的接口. URL定位资源,用HTTP动词( ...

  2. HTTP协议----URI,URL,持久连接,管道与Cookie

    URI与URL有什么不同呢? URI:Universal Resource Identifier统一资源标志符 URL:Universal Resource Locator统一资源定位器 URI是用来 ...

  3. net 把指定 URI 的资源下载到本地

    DirectoryInfo dir = new DirectoryInfo(AppContext.BaseDirectory); var path = dir.FullName + @"te ...

  4. 17_点击事件第四种写法_布局文件添加onclick属性

    尽量不要用第四种点击事件的写法.在一万多行代码中发现了一个没被调用的代码 public void call(View v){//第四种写法参数一定是View v //public void call( ...

  5. REST的本质,就是用户操作某个网络资源(具有独一无二的识别符URI),获得某种服务,也就是动词+资源(都是HTTP协议的一部分)

    REST的名称”表现状态转化”中,省略了主语.”表现”其实指的是资源的表现. 资源就是网络上的一个数据实体,或者说是一个具体信息.它可以是一段文本.一张图片.一首歌曲.一种服务.你可以用一个URI(统 ...

  6. RESTful API URI 设计: 判断资源是否存在?

    相关的一篇文章:RESTful API URI 设计的一些总结. 问题场景:判断一个资源(Resources)是否存在,URI 该如何设计? 应用示例:判断 id 为 1 用户下,名称为 window ...

  7. http协议进阶(二)URL与资源

    一.URL的语法  URL是互联网资源的标准化名称 URL提供了一种定位互联网上任意资源的手段,但这些资源要通过不同方案(协议:比如http.ftp.smtp)来访问,因此URL语法会略有差异 大部分 ...

  8. Web体系=资源+URI+表示

    概述 Web有三个核心概念:资源(Resource).URI(UniformResource Identifer,统一资源标识符).表示(Representation).一个资源由一个URI进行标识. ...

  9. WPF 中的 Pack URI地(资源文件加载)

    参考资源网http://msdn.microsoft.com/zh-cn/library/aa970069.aspx#Absolute_vs_Relative_Pack_URIs 在 Windows ...

随机推荐

  1. springcloud微服务实战--笔记--1、基础知识

    微服务的问题: 分布式事务和数据一致性. 由于分布式事务本身第实现难度就非常大,所以在微服务架构中,我们更强调在各服务之间进行无事务第调用,而对于数据一致性,只要求数据在最后第处理状态是一致第即可:若 ...

  2. 高性能流媒体服务器EasyDSS前端重构(三)- webpack + vue + AdminLTE 多页面引入 element-ui

    接上篇 接上篇<高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间> 本文围绕着实现EasyDSS高性能流 ...

  3. iOS怎样获取任何App的资源图片?

    1.打开iTunes,并与手机相连接 2.按照下图所示执行搜索并下载App 3.到Mac的 /Users/apple/Music/iTunes/iTunes Media/Mobile Applicat ...

  4. eclipse中 svn出现 E220000 解决办法

    这种情况,先试试修改svnserve.conf 中的 anon-access = none 然后重启eclipse   如果还是不行,还有可能是因为你修改了svn的配置链接后 跟他人的svn连接方式有 ...

  5. 查找SAP 系统Parameter ID 4种方法

    转自 http://blog.csdn.net/jy00873757/article/details/8517426 ***程序RPR_ABAP_SOURCE_SCAN  一.用F1,直接可以看到这个 ...

  6. JETSON TK1~Ubuntu14.04 Armhf源更新

    Ubuntu armhf版本的源网址不同于普通Ubuntu系统,如果采用如下网址会出现问题,导致sudo apt-get update出现Error. 之前的连接: deb http://archiv ...

  7. 《高性能Javascript》 Summary(三)

    第八章.编程实践 Programming Practices 经验: 避免使用 eval_r()和Function构造器避免二次评估.此外,给setTimeout()和setInterval()函数传 ...

  8. Delphi编写WebService体会

    源:Delphi编写WebService体会 Dispatch: 派遣,分派 Invoke: 调用 Invokable: 可调用接口 TReomtable: WebService中自定义类都是继承自该 ...

  9. Android Weekly Notes Issue #318

    Android Weekly Issue #318 July 15th, 2018 Android Weekly Issue #318 本期内容包括: Android Navigation Compo ...

  10. 学习 Promise,掌握未来世界 JS 异步编程基础

    其实想写 Promise 的使用已经很长时间了.一个是在实际编码的过程中经常用到,一个是确实有时候小伙伴们在使用时也会遇到一些问题.Promise 也确实是 ES6 中 对于写 JS 的方式,有着真正 ...