URI - 统一资源标识符
1 URI & URL & URN
URI, URL 和 URN 是三个经常放在一起的概念,下面这段摘自 RFC 文档的一段话描述了它们之间的关系:
A URI can be further classified as a locator, a name, or both. ]
更形象地,可以用维基百科上的一张图来说明:
而下面这段摘自维基百科的一段话,表明了 URL
和 URN
的作用:URL 标识资源位置,而 URN 标识资源身份。
A URN may be compared to a person's name, while a URL may be compared to their street address. In other words, a URN identifies an item and a URL provides a method for finding it.]
由于这篇博客的主题为 URI
, 因此只在这里简单的提及一下 URL
和 URN
, 如果需要详细了解,可以自己 Google 相关资料。
2 URI 通用语法
URI
的通用语法由五个组件组成:
URI = scheme:[//authority]path[?query][#fragment]
其中,authority 组件可以由以下三个组件组成:
authority = [userinfo@]host[:port]
实际的例子:
userinfo host port ┌─┴────┐ ┌────┴────────┐ ┌┴┐ https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top └─┬─┘ └───────┬────────────────────┘└─┬─────────────┘└──┬───────────────────────┘└┬─┘ scheme authority path query fragment ldap://[2001:db8::7]/c=GB?objectClass?one └─┬┘ └───────┬─────┘└─┬─┘ └──────┬──────┘ scheme authority path query mailto:John.Doe@example.com └──┬─┘ └─────────┬────────┘ scheme path news:comp.infosystems.www.servers.unix └─┬┘ └───────────────┬───────────────┘ scheme path tel:+1-816-555-1212 └┬┘ └──────┬──────┘ scheme path telnet://192.0.2.16:80/ └──┬─┘ └──────┬──────┘│ scheme authority path urn:oasis:names:specification:docbook:dtd:xml:4.1.2 └┬┘ └──────────────────────┬──────────────────────┘ scheme path
3 URI 协议
这才是写这篇博客的主要目的,前面的内容都是顺带的,不然总感觉差点啥 @_@.
3.1 file
file
应该算是一个比较常用的协议了,它的格式如下:
file://host/path
需要注意的一点是,在 Windows
系统中,需要在实际文件路径的 盘符 前添加一个斜杠才能作为 URI
中的路径:
file:///C:/Users/Administrator/Desktop/example.txt
上面这个省略了 host
的 URI
标识的文件为:
C:/Users/Administrator/Desktop/example.txt
由于这种在 Windows
上不太自然的路径表示形式,是容易让人感到迷惑的。
- RFC 文档: RFC 8089 - The "file" URI Scheme
- 维基百科: file URI scheme - Wikipedia
3.2 mailto
mailto
是用来表示邮箱地址的 URI
协议,常见的形式为:
mailto:someone@example.com
通过 query
部分指定一些初始值:
mailto:someone@example.com?subject=xxx&cc=someone_else@example.com&body=xxx
指定多个邮箱地址:
mailto:someone@example.com,someoneelse@example.com
mailto
的完整语法还是有点复杂的,有兴趣的可以了解一下。
- RFC 文档: RFC 6068 - The 'mailto' URI Scheme
- 维基百科: mailto - Wikipedia
3.3 data
data
在前端应该也是比较常用的一个协议了,提供了一种在网页中包含数据的方法,格式如下:
data:[<media type>][;base64],<data>
各部分的含义:
media type
- 可选,指定媒体类型,格式为attribute=value
, 用;
分隔base64
- 可选,通过;
与前面的内容分隔,表示 URI 的数据内容是二进制数据,通过 base64 将二进制数据编码为 ASCII 文本data
- 包含的数据,使用,
与前面的内容分隔
一个最小的 data
URI:
data:,
data
协议可以包含的数据类型很多,常用的是直接在网页连接中包含图片:
<img src="data:image/png;base64,iVBORw0KGgoAAA ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4 //8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU 5ErkJggg==" alt="Red dot" />
更多的媒体类型可以通过查阅相关资料进行了解。
- RFC 文档: RFC 2397 - The "data" URL scheme
- 维基百科: Data URI scheme - Wikipedia