HTTP之统一资源定位符URL

转载请注明出处:
本文出自:NiZhuanXingHe的博客

概述

每一个服务器资源都有一个名字,服务器的资源名被称为 统一资源标识符 ——URI,URI有两种形式,分别是URL(统一资源定位符)和URN(统一资源名),目前,URL被使用的很广泛。

URL

可以这么说,URL是web客户端向web请求信息时所需的资源位置,通过url,web客户端可以获取到数据资源。

1、URL的语法

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
<方案>://<用户>:<密码>@<主机>:<端口>/<路径>;<参数>?<查询>#<片段>
  • 方案:访问服务器获取资源所使用的协议,如:http、ftp
  • 用户:访问资源的用户名
  • 密码:用户名后可能包含的密码
  • 主机:资源宿主服务器的主机名或ip地址
  • 端口:资源宿主服务器正在监听的端口号,默认为 80
  • 路径:服务器资源本地名,由斜杠(/)与前面URL组件分隔开
  • 参数:相互之间,以及与URL前面组件由分号(;)分隔开
  • 查询:用问号(?)与URL其余组件分隔开
  • 片段:一小片或者一部分资源名字。引用对象时,不会讲frag传给服务器;这个值在客户端内部使用。通过字符(#)将其与URL的其余部分分隔开来
1.1、主机和端口
http://www.joes-hardware.com:80/index.html
http://192.0.0.168:80/index.html

这两个url,前者是主机名:端口,后者是ip地址:端口。若是主机名,则需要通过DNS得到主机ip地址,之后才能访问。

1.2、用户名和密码
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://cwb@ftp.prep.ai.mit.edu/pub/gnu
ftp://cwb:cwbpassword@ftp.prep.ai.mit.edu/pub/gnu
http://cwb:cwbpassword@www.cwb-guitar.com/sales_info.txt

第一个例子没有用户或密码组件,只有标准化方案(ftp:文件传输协议)、主机(ftp.prep.ai.mit.edu)和路径(/pub/gnu);
第二个例子指定了一个用户名(cwb);
第三个例子用户名(cwb)和密码(cwbpassword)之间由字符":"隔开;
第四个例子则包含用户名和密码,标准化方案为http。

1.3、路径

url路径说明了资源位于服务器的具体位置,如:

http://www.jjjjj.com:80/aaa/bbb/index-a.html

其中“/aaa/bbb/index-a.html”就是这个url的路径。

1.4、参数

对于很多方案来说,仅仅通过方案名、主机、端口、用户名、密码和路径仍不能完成工作,还需要提供更多的信息。负责解析url的应用程序需要这些协议参数来访问资源并提供正确的服务。

ftp://prep.ai.mit.edu/pub/gnu;type=d
ftp://www.cwbftp.com/aaa;param1=false/index.html;param2=good

第一个例子中,有一个参数type=d,参数名是type,值为d;
第二个例子中,url有两段路径,每段路径又一个参数,分别是param1,值为false,param2,值为good。HTTP URL的路径组件可以分成若干路径段。

1.5、查询字符串

查询字符串用于缩小请求资源的范围:

http://www.abc.com/check-data?page=2
http://www.abc.com/check-data?page=2&level=0

上面例子中,诸如“age=2”这样的字段就是查询字符串,与其他URL组件以(?)隔开。查询字符可以有多组名值对,它们以&隔开。

1.6、片段
http://www.abc.com/doc.html#chapter1

这个url中,用(#)与前段隔开的字符chapter1就是片段,客户端不会将片段传送给服务器,所以请求服务器资源时获取的会是的整个doc.html内容,但是收到这些数据资源后,客户端本地会以碎片过滤得到chapter1部分内容。

2、URL快捷方式

Web客户端可以理解并使用几种URL快捷方式:相对URL和URL自动扩展。

2.1、相对URL

URL有两种方式,相对和绝对。绝对URL中包含访问资源所需的全部信息;而相对URL则是一种便捷缩略的不完整记法。
相对URl必须相对一个基础URL进行解析,才能获得完整的URL。

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>相对url实例</title>
    <base href="https://www.guitar.com/">
</head>
<body>
    <a href="/data/postguitarsheet">上传吉他谱</a>
</body>
</html>

如上面的html代码所示,在head下的base标签中href的值"https://www.guitar.com/",就是一个基础URL,body下的a标签的href的值是一个相对URL,它是合法的,但需要和基础url对比和解析,得到一个完整URL,即绝对URL,“https://www.guitar.com/data/postguitarsheet”。这里是去掉’/'拼接就可以,但有时候不需要去除其他部分,可直接拼接在一起,成为一个完整的URL。
上面的例子给出了显示提供的基础URL,但有时是不会显示提供,而是封装起来。这个时候的基础URL需要经过推导才能得到。有些情况下,基础URL也不会被给出。
将相对URL转换成绝对URL的过程:
这里写图片描述
上面的这张图,是基础URL和相对URL的所有组件拆开,进行比较判断,最后经处理,将相对URL合成绝对URL。
这种方法或函数在很多语言中是被官方提供的,如java:

URL baseUri = new  URL("http://www.enet.com.cn/enews/inforcenter/designmore.jsp");
URL absoluteUri = new URL( baseUri, "../test.html");
absoluteUri.toString();
2.1、自动扩展URL

当你向浏览器输入一个不完整的URL,浏览器会帮你自动扩展一个完整路径,通过两种方式:

  • 主机名扩展:比如你在浏览器地址栏输入"baidu",浏览器会构建出"www.baidu.com",如果匹配不到,会尝试换几种方式扩展。

  • 历史记录扩展:浏览器会存储用户访问历史,当你输入一条语句,它会在历史记录中匹配。

3、URL字符

URL满足以下三个特性:

  • 可移植的:统一命名因特网上所有资源,并可通过任意因特网协议安全传输。
  • 可读的:可见、可打印;
  • 完整的:那么信息不能丢失。但有些协议会剔除一些特定字符,所以URL只能使用较小的、安全的、通用的字母表中的字符,并将不安全字符转义成安全字符,再进行传输。
3.1、字符集

URL使用US-ASCII字符集,但US-ASCII很通用,并不能支持各种国家民族语言中的常见变体字符,所以URL集成了转义序列,通过转义序列,就能US-ASCII字符集的有限子集对任意字符或数据进行编码,包括二进制数。

3.2、URL编码

就是一种转义编码,将URL中的不安全字符转义成安全的字符组合。
格式:一个百分号(%),后面是两个ASCII的十六进制数。

字符ASCII码示例
空格32(0x20)http://www.abd.com/dog%20waste.html
126(0x7E)http://www.abd.com/%7Edogwaste.html
3.3、URL字符限制

这里写图片描述

4、Web方案

Web方案有很多:

  • http:超文本传输协议;
基本格式:
	http://<host>:<port>/<path>?<query>#<frag>
示例:
	http://www.jitashe.org/artist
  • https:http+ssl;
基本格式:
	https://<host>:<port>/<path>?<query>#<frag>
示例:
	https://www.baidu.com/cache/sethelp/help.html
  • ftp:文件传输协议
基本格式:
	ftp://<user>:<password>@<host>:<port>/<path>;<params>
示例:
	ftp://nzxh:123456@guitar.com:80/sheet/page1;type=classic
  • file:指定一台主机上可直接访问的文件;
基本格式:
	file://<host>/<path>
示例:
	file://myhost/document/index.html
  • news:用于访问一些特定的文章或新闻组;
基本格式:
	news:<newsgroup>
	news:<news-article-id>
示例:
	news:rec.arts.starpage
  • telnet:用于访问交互式业务,它不是对象本身,而是可以通过telnet协议访问的交互式应用程序;
基本格式:
	ftp://<user>:<password>@<host>:<port>/
示例:
	ftp://nzxh:123456@guitar.com:80/
  • mailto: Mailto URL指向的是E-mail地址,因特网E-mail地址的语法记录在RFC-822中;
基本格式:
	mailto:<RFC-822-addr-spec>
示例:
	mailto:aaaaa@163.com
  • rtsp/rtspu:RTSP URL是通过实时流传输协议(Real Time Streaming Protocol)解析的音/视频媒体资源标识符
基本格式:
	rtsp://<user>:<password>@<host>:<port>/<path>
	rtspu://<user>:<password>@<host>:<port>/<path>
示例:
	rtsp://nzxh:123456@guitar.com:80/sheet/page1

总结

未来,URL还会被改进。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值