所有东西都有一个标准化的名字,以帮助人们寻找城市中的各种资源。书籍有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请求各种浏览器又会有不同的编码方式。

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

最新文章

  1. Windows server用好windows server backup,发挥个人电脑该有的系统还原功能
  2. 《深入了解 Linq to SQL》之对象的增删改 —— 麦叔叔呕心呖血之作
  3. 提升网站用户体验—WebP 图片的高效使用
  4. Windows下Vundle插件BundleSearch命令出现错误解决方案
  5. 在Centos 5.6下安装 redis
  6. java中,Date数据类型和JSONObject数据类型之间的转换
  7. Directx11学习笔记【十七】纹理贴图
  8. [mysql使用(2)] mysql的一些语法与Oracle的差别
  9. 八、VueJs 填坑日记之参数传递及内容页面的开发
  10. 安装Loadrunner 11.0时,弹出缺少2.8 sp1组件--解决方案(win7)
  11. 南阳OJ-6-喷水装置(一)
  12. js前后五年的时间日期万年历
  13. centos6 升级安装openssh7
  14. Codeforces Round #408 (Div. 2) 题解【ABCDE】
  15. ASP.NET Core 启动流程图
  16. sap hana 数据库 EBS
  17. day06 小数据池,再谈编码
  18. 并发编程之 LinkedBolckingQueue 源码剖析
  19. spring中获取ApplicationContext对象的技巧,含源码说明
  20. hibernate的多对多关联映射

热门文章

  1. 微信小程序TabBar的使用
  2. 【BZOJ4166】月宫的符卡序列 Manacher+hash
  3. Redis实现主从复制(转)
  4. HTML5(lufylegend.js练习)
  5. 九度OJ 1147:Jugs(罐子) (模拟、游戏)
  6. 九度OJ 1026:又一版 A+B (进制转换)
  7. python 的print 用法
  8. 友盟分享到微信的几点备忘(IOS)
  9. fragment 动态加载
  10. python之virtualenv 与 virtualenvwrapper 详解