1.URI 模板(URI Template) #
RFC 6570 定义了一种称为 URI 模板(URI Template) 的语法,用于动态构建 URI(统一资源标识符)。URI 模板允许在字符串中嵌入变量,并在运行时替换这些变量以生成完整的 URI。它广泛应用于 RESTful API、超媒体系统(如 HAL、JSON Hyper-Schema)和 Web 链接中。
2. URI 模板的基本概念 #
URI 模板是一个字符串,其中包含 变量表达式(variable expressions),这些表达式在运行时会被替换为实际值。例如:
http://example.com/{user}/posts{?page,limit}{user}、{page}、{limit}是变量,运行时会被替换成实际值。- 最终可能生成:
http://example.com/johndoe/posts?page=2&limit=10
3. URI 模板的语法 #
3.1 变量表达式(Variable Expressions) #
变量表达式的基本形式是 {变量名} 或 {变量名*}(用于路径扩展):
{var}→ 普通变量{var*}→ 路径扩展(用于/分隔的路径变量){+var}→ 保留字符(如/、?不会被转义){#var}→ 片段标识符(如#section){.var}→ 点分隔扩展(如.min.js){/var}→ 路径段扩展(如/user/john){;var}→ 参数扩展(如;name=john){?var}→ 查询参数扩展(如?q=search){&var}→ 查询参数连接(如&page=1)
示例:
http://example.com/{user}{/path*}{?query,limit}- 如果
user="john",path=["posts", "123"],query="search",limit=10,则扩展为:http://example.com/john/posts/123?query=search&limit=10
3.2 操作符(Operators) #
操作符影响变量如何插入 URI:
| 操作符 | 含义 | 示例 |
|--------|------|------|
| {var} | 默认(可能转义 /、? 等) | {user} → john%20doe |
| {+var} | 保留字符不转义 | {+path} → dir/file |
| {#var} | 用于 URI 片段(# 后) | {#section} → #intro |
| {.var} | 点分隔扩展 | {.ext} → .json |
| {/var} | 路径段扩展 | {/user} → /john |
| {;var} | 分号参数扩展 | {;params} → ;a=1;b=2 |
| {?var} | 查询参数扩展 | {?query} → ?q=hello |
| {&var} | 查询参数连接 | {&page} → &page=1 |
4. 级别(Levels) #
RFC 6570 定义了 4 个级别(Levels),表示不同的功能支持程度:
| 级别 | 描述 | 示例 |
|------|------|------|
| Level 1 | 仅简单变量替换 | {var} |
| Level 2 | 支持 +、#、.、/、;、? | {+path}/file |
| Level 3 | 支持所有操作符 | {?query,limit} |
| Level 4 | 支持复合变量(数组/对象) | {user:2}(截取前 2 字符) |
5. 实际应用 #
5.1 RESTful API 设计 #
GET /users/{id}/posts{?page,limit}- 替换
{id},{page},{limit}后:GET /users/123/posts?page=1&limit=10
5.2 超媒体(HAL, JSON Hyper-Schema) #
{
"_links": {
"self": { "href": "/users/{id}" },
"search": { "href": "/search{?q}" }
}
}- 运行时替换
{id}和{q}生成完整 URI。
5.3 JavaScript 实现 #
使用库如 uritemplate(Node.js):
const uriTemplate = require('uritemplate');
const template = uriTemplate.parse('http://example.com/{user}/posts{?page}');
const uri = template.expand({ user: 'john', page: 2 });
console.log(uri); // "http://example.com/john/posts?page=2"6. 总结 #
- RFC 6570 定义了 URI 模板,用于动态生成 URI。
- 变量表达式 如
{var}、{+var}、{?var}等控制 URI 的构造方式。 - 4 个级别 提供不同的功能支持。
- 广泛应用于 REST API、超媒体系统、前端路由 等场景。
如果你正在设计 API 或需要动态构建 URL,URI 模板是一个非常强大的工具!