URI 术语
注: 后面大量章节涉及到
URI
标准中的诸多术语,为了概念清晰,单独开一章来介绍。
URI的语法
通用 URI 和绝对 URI 的语法参考最初定义在 RFC 2396,发布于1998年,并定稿于 RFC 3986, 发布于 2005年。
通用 URI 的形式如下:
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
它包括:
scheme
由一系列字符组成,以字母开头,跟着有字母,数字,加号(+),点号(.)或者中划线(-)的任何组合。
虽然 scheme 是大小写不敏感,但是权威形式是小写并注明特定 scheme 必须也同样是小写。后面跟一个冒号(:)。流行的 scheme 例子包括
http
,ftp
,mailto
,file
, 和data
。URI scheme 应该在 Internet Assigned Numbers Authority (IANA) 注册,虽然不注册的 scheme 实际也在使用。双斜杠(//)
某些 scheme 要求有这个, 而有些 scheme 不要求。当 authority 部分缺失时, path 部分不能以双斜杠开始。
authority部分
包括:
- 可选的认证部分,有用户名和密码,冒号分隔,带一个@符号
- host,包括一个被注册名字(包括但是不限于hostname),或者 IP 地址。IPv4 地址必须以点号分割的形式,而 IPv6 地址必须加[]符号。
- 可选的端口号,和hostname之间用冒号分隔。
路径
包含数据,通常以层次形式组织,表现为一系列斜杠分隔的部分。这样一个序列可能类似或者映射到文件系统路径,但是并不暗示一定和某个路径有关系。如果有 authortity 部分,则路径必须以单斜杠开始,
可选的query
和之前的部分以问号(?)分隔,包含非层次数据的 query string 。它的语法没有很好的定义,但是习惯上通常是一系列的属性值对,以分隔符分隔。
可选的fragment/片段*
和之前的部分以#分隔。fragment 包括一个 fragment identifier / 片段标识,提供到间接资源的引导,就像文章中的章节头,通过URI的剩余部分定位。当首要资源是 HTML 文档时,fragment 通常是一个特别原始的 id 属性,而web浏览器将滚动这个元素到视野中。
例子
下面的图片展示了两种URI的例子,和他们的组成部分。
hierarchical part
┌───────────────────┴─────────────────────┐
authority path
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
scheme user information host port query fragment
urn:example:mammal:monotreme:echidna
└┬┘ └──────────────┬───────────────┘
scheme path
特别强调
authority代表URI中的 [userinfo@]host[:port],包括host(或者ip)和可选的port和userinfo。
这个术语平时用的不多,但是在gRPC中频繁出现,请牢记:authority 代表 username:password@example.com:123
这一段。