第2章:CRUD模式(CRUD Patterns)
一、导读
1.1 本章学习目标
第2章讲解 API 设计中最基础的模式——CRUD(创建、读取、更新、删除)。
本章的核心学习目标包括:
- 掌握资源命名的最佳实践
- 理解 HTTP 方法的语义
- 学会设计请求和响应格式
- 掌握错误处理的标准模式
1.2 为什么本章如此重要
CRUD 是 80% 的 API 操作。设计好 CRUD 模式,就奠定了整个 API 的基础。
1.3 核心问题引导
REST 的 CRUD 操作如何映射到 HTTP 方法?
如何设计清晰的资源命名?
错误响应应该包含什么信息?
创建操作应该返回什么?
二、核心概念详解
2.1 HTTP 方法语义
HTTP 方法与 CRUD 的映射:
POST → Create(创建)
GET → Read(读取)
PUT → Replace(全量替换)
PATCH → Update(部分更新)
DELETE → Delete(删除)
幂等性:
- GET, PUT, DELETE:幂等(多次执行结果相同)
- POST:非幂等(每次创建新资源)
- PATCH:通常幂等2.2 资源命名
资源命名规则:
1. 使用名词,不用动词
✓ GET /users
✗ GET /getUsers
2. 使用复数形式
✓ GET /users/123
✗ GET /user/123
3. 层级关系用路径表示
✓ GET /users/123/orders
✗ GET /orders?userId=123
4. 使用 kebab-case
✓ GET /order-items
✗ GET /orderItems2.3 错误处理
json
// 标准错误响应格式
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"details": [
{
"field": "email",
"message": "Invalid email format",
"code": "INVALID_FORMAT"
}
],
"requestId": "req_abc123"
}
}
// HTTP 状态码使用
200 OK // 成功
201 Created // 创建成功
204 No Content // 删除成功
400 Bad Request // 请求格式错误
401 Unauthorized // 未认证
403 Forbidden // 无权限
404 Not Found // 资源不存在
409 Conflict // 冲突
422 Unprocessable // 验证失败
500 Internal // 服务器错误2.4 字段掩码(Field Mask)
// 请求指定返回字段
GET /api/v1/users/123?fields=name,email
// 响应只包含指定字段
{
"name": "Alice",
"email": "alice@example.com"
}
// 减少数据传输,提高性能三、实战案例
3.1 案例一:完整的 CRUD API
用户管理 API:
# 创建
POST /api/v1/users
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com"
}
→ 201 Created
{
"id": "usr_123",
"name": "Alice",
"email": "alice@example.com",
"createdAt": "2024-01-01T00:00:00Z"
}
# 读取
GET /api/v1/users/usr_123
→ 200 OK
# 列表
GET /api/v1/users?pageToken=xxx&pageSize=20
→ 200 OK
# 更新
PATCH /api/v1/users/usr_123
{
"name": "Alice Smith"
}
→ 200 OK
# 删除
DELETE /api/v1/users/usr_123
→ 204 No Content四、本章小结
HTTP 方法:POST 创建、GET 读取、PUT 替换、PATCH 更新、DELETE 删除。
资源命名:名词复数、kebab-case、层级路径。
错误处理:标准格式、合适的状态码、详细信息。
字段掩码:减少数据传输。
五、思考与练习
设计一个商品管理 API 的完整 CRUD 操作。
PUT 和 PATCH 有什么区别?各适用于什么场景?
如何设计一个支持批量操作的 API?