1. 简介
在本文中,我们将介绍 URI(Uniform Resource Identifier) 的概念,详细解析其组成部分,并说明它的用途。此外,我们还会说明 URI 与 URL、URN 之间的关系。
✅ 如果你对 Java 中的 URL 和 URI 有疑问,推荐阅读:Java URL vs URI 深度对比
2. 什么是统一资源标识符(URI)
URI 是一段用于标识超文本资源的字符序列。这个资源可以是抽象的,也可以是物理存在的,甚至可能是尚未创建的未来资源。URI 的语法设计非常灵活,能够涵盖各种使用场景。
2.1. URI 的通用语法结构
根据 RFC 1630,一个通用的 URI 通常由以下几个部分组成:
- scheme(协议)
- authority(授权信息)
- path(路径)
- query(查询参数)
- fragment(片段)
下图展示了 URI 的语法结构:
2.2. URI 各个组成部分详解
接下来我们逐个介绍这些部分:
scheme(协议)
URI 的第一个组成部分,由一个字母开头,后跟字母、数字、加号(+)、点号(.)或连字符(-)组成。虽然语法上不区分大小写,但推荐使用小写。例如:http
、https
、mailto
。✅ scheme 是必须的,不能省略。
authority(授权信息)
通常包含用户名、主机名和端口号,结构如下:[username@]host[:port]
例如:
user@example.com:8080
path(路径)
由斜杠(/)分隔的路径片段组成,例如:/wiki/Main_Page
query(查询参数)
可选部分,通常以问号(?)开头,包含多个键值对,用&
或;
分隔。例如:?page=1&limit=10
fragment(片段)
可选部分,以井号(#)开头,用于标识资源内部的某个子部分。例如:#section-3
3. URI 示例
我们来看一些 URI 的实际使用示例,它可以作为定位器、名称,或者两者兼具。
3.1. URL 示例
看下面这个 URI 示例:
这是一个 URL(Uniform Resource Locator),属于 URI 的一个子集,用于标识资源在网络中的位置,并说明如何获取该资源。
例如:
http://example.org/wiki/Main_Page
http
是 schemeexample.org
是 host/wiki/Main_Page
是 path
这个 URL 表示通过 HTTP 协议从 example.org
获取 HTML 页面 /wiki/Main_Page
。
⚠️ Java 等语言在处理 URL 时需要特殊编码/解码处理,请参考:Java URL 编码解码实践
3.2. URN 示例
URN(Uniform Resource Name) 是 URI 的另一个子集,用于提供全球唯一且持久的资源标识,即使资源不存在或无法访问。
URN 的通用格式为:
urn:<namespace>:<specific part>
例如:
书籍 ISBN 号:
urn:isbn:0451450523
表示书籍《The Last Unicorn》
电影 ISAN 编号:
urn:isan:0000-0000-2CEA-0000-1-0000-0000-Y
表示电影《Spider-man》
3.3. 其他常见 URI 协议
除了最常见的 http
和 https
外,还有以下协议:
协议 | 用途 |
---|---|
tel |
电话号码 |
mailto |
邮件地址 |
skype |
Skype 通话 |
ftp |
文件传输 |
file |
本地文件路径 |
✅
http
使用 80 端口通信,不加密,存在安全风险;而https
使用加密通信并需要证书验证,安全性更高。
4. 关于 URI 协议(Scheme)
URI 的第一个组成部分就是 scheme,它非常关键:
- 它告诉解析器这个 URI 的资源类型
- 指明了 URI 的解析方式
- 决定了相关的语义规则
通常,一个命名机构会定义该 scheme 的 URI 类型、格式和语义。许多 URI scheme 都注册在 IANA(Internet Assigned Numbers Authority),它是协调互联网标准的机构。
不过,并不是所有正在使用的 scheme 都在 IANA 注册过。
5. 总结
在本文中,我们介绍了 URI 的概念、组成部分,以及它与 URL 和 URN 的关系。
最关键的部分是 URI 的 scheme,它决定了:
- 使用哪种协议
- 如何解析 URI
- 如何访问对应资源
理解 URI 的结构和作用,对于 Web 开发、API 设计、网络通信等场景都非常有帮助。如果你正在开发 Java 应用,也建议阅读:Java URL 与 URI 的区别详解 来进一步理解实际应用中的差异。