3. 路径与操作:定义API端点、HTTP方法、操作ID、标签与分组
路径(Path)与操作(Operation)是OpenAPI规范的核心骨架。路径定义了API暴露的端点(Endpoint),操作则描述了在该端点上允许的HTTP方法及其行为。本章将深入讲解如何规范地定义路径、选择HTTP方法、分配操作ID(operationId)、以及使用标签(Tags)进行逻辑分组。
3.1 路径定义:端点结构
在OpenAPI中,路径以/开头,支持静态路径与动态路径参数。路径参数使用花括号{}包裹,并在parameters字段中声明。
路径设计原则:
- 使用名词复数形式表示资源(如
/users、/orders)。 - 路径层级不宜过深,建议不超过3层。
- 路径参数应语义明确,避免歧义。
paths:
/users:
get:
summary: 获取用户列表
operationId: listUsers
post:
summary: 创建新用户
operationId: createUser
/users/{userId}:
get:
summary: 获取单个用户
operationId: getUserById
parameters:
- name: userId
in: path
required: true
schema:
type: integer
put:
summary: 更新用户信息
operationId: updateUser
delete:
summary: 删除用户
operationId: deleteUser
3.2 HTTP方法选择与语义
每个路径下可定义多个操作,每个操作对应一个HTTP方法。常用方法及其语义如下:
| HTTP方法 | CRUD对应 | 幂等性 | 请求体 | 典型场景 |
|---|---|---|---|---|
| GET | Read | 是 | 无 | 查询资源列表或详情 |
| POST | Create | 否 | 有 | 创建新资源、提交操作 |
| PUT | Update/Replace | 是 | 有 | 全量更新资源 |
| PATCH | Partial Update | 否 | 有 | 部分更新资源 |
| DELETE | Delete | 是 | 无 | 删除资源 |
最佳实践: 对于非CRUD操作(如激活、暂停),优先使用POST + 动作路径(如
/users/{userId}/activate),而非在GET或PUT中附加副作用。
3.3 操作ID(operationId)
operationId 是操作的唯一标识符,在整个API文档中必须唯一。它常用于生成客户端SDK的方法名、日志追踪以及文档锚点。
paths:
/orders:
get:
operationId: listOrders # 推荐:动词 + 资源复数
summary: 获取订单列表
post:
operationId: createOrder # 推荐:动词 + 资源单数
summary: 创建订单
/orders/{orderId}:
get:
operationId: getOrderById # 推荐:动词 + 资源 + By + 参数
summary: 根据ID获取订单
delete:
operationId: deleteOrder # 推荐:动词 + 资源
summary: 删除订单
避坑指南: 避免使用模糊的operationId,如
getData、process。建议采用 <动词><资源>[By<参数>] 的命名模式,确保在代码生成和API文档中清晰可辨。
3.4 标签与分组
标签(Tags)用于对操作进行逻辑分组,在API文档中通常表现为分组标题。一个操作可以关联多个标签,但通常只使用一个主要标签。
paths:
/users:
get:
tags:
- 用户管理
operationId: listUsers
summary: 获取用户列表
post:
tags:
- 用户管理
operationId: createUser
summary: 创建用户
/orders:
get:
tags:
- 订单管理
operationId: listOrders
summary: 获取订单列表
/users/{userId}/orders:
get:
tags:
- 订单管理
- 用户管理
operationId: listUserOrders
summary: 获取指定用户的订单列表
标签也可以在顶层tags字段中预先定义,并添加描述信息:
tags:
- name: 用户管理
description: 用户相关的增删改查操作
- name: 订单管理
description: 订单查询与创建操作
3.5 路径与操作结构总览
下图展示了路径、HTTP方法、操作ID与标签之间的层级关系:
3.6 路径参数与查询参数
路径参数(Path Parameters)是URL路径的一部分,而查询参数(Query Parameters)附加在URL末尾。两者在OpenAPI中的定义方式不同:
| 参数类型 | 位置 | 示例 | 是否必须 | 典型用途 |
|---|---|---|---|---|
| 路径参数 | in: path |
/users/{userId} |
是 | 资源标识符 |
| 查询参数 | in: query |
/users?page=1&size=20 |
否 | 过滤、分页、排序 |
| 请求头参数 | in: header |
Authorization: Bearer xxx |
视情况 | 认证、内容协商 |
paths:
/users:
get:
operationId: listUsers
parameters:
- name: page
in: query
schema:
type: integer
default: 1
- name: size
in: query
schema:
type: integer
default: 20
/users/{userId}:
get:
operationId: getUserById
parameters:
- name: userId
in: path
required: true
schema:
type: integer
3.7 标签分组与API文档导航
合理的标签分组能显著提升API文档的可读性。下图展示了标签如何影响文档的导航结构:
标签分组建议:
- 按业务领域分组(如用户管理、订单管理、支付管理)。
- 每个操作只关联一个主要标签,避免交叉混乱。
- 在顶层
tags字段中为每个标签添加描述,提升文档可读性。
3.8 常见错误与避坑
| 错误类型 | 错误示例 | 正确做法 |
|---|---|---|
| 路径参数未声明 | /users/{id} 但未定义 parameters |
在操作或路径级别声明 parameters |
| operationId 重复 | 两个操作都使用 getData |
确保全局唯一,如 getUserById、getOrderById |
| HTTP方法误用 | 用GET创建资源 | 创建用POST,查询用GET |
| 标签滥用 | 一个操作关联5个标签 | 每个操作最多关联1-2个标签 |
关键提醒: 路径与操作的定义是API契约的基石。一旦发布,修改路径或operationId将导致客户端代码断裂。建议在开发初期使用API设计工具(如Swagger Editor、Stoplight)进行可视化验证,确保路径结构、方法语义和标签分组符合团队规范。