什么是好的 API?
好的 API 应该是:
- 易于理解 - 清晰的命名和文档
- 易于使用 - 一致的设计模式
- 易于维护 - 良好的版本控制和向后兼容性
- 安全可靠 - 身份验证、授权、速率限制
- 高性能 - 快速响应和高效的资源使用
RESTful API 原则
基本概念
REST(Representational State Transfer)是一种架构风格,基于以下原则:
- 客户端-服务器架构 - 分离关注点
- 无状态 - 每个请求包含所有必要信息
- 可缓存 - 响应应该定义自己是否可缓存
- 统一接口 - 一致的 API 设计
- 分层系统 - 客户端不知道是否直接连接到最终服务器
HTTP 方法
GET 获取资源
POST 创建新资源
PUT 替换整个资源
PATCH 部分更新资源
DELETE 删除资源
HEAD 获取资源元数据(不返回响应体)
OPTIONS 获取资源的通信选项
资源和 URL 设计
好的设计:
GET /api/v1/users 获取用户列表
POST /api/v1/users 创建新用户
GET /api/v1/users/:id 获取特定用户
PUT /api/v1/users/:id 更新用户
DELETE /api/v1/users/:id 删除用户
GET /api/v1/users/:id/posts 获取用户的文章
不好的设计:
GET /api/getUser
GET /api/createUser
GET /api/updateUser?id=1
GET /api/deleteUser?id=1
关键原则
- 使用名词而不是动词 -
/users而不是/getUsers - 使用复数形式 -
/users而不是/user - 使用小写 -
/api/users而不是/api/Users - 使用连字符分隔单词 -
/user-profiles而不是/userProfiles - 避免深层嵌套 - 最多两层
/users/:id/posts
版本控制
URL 版本控制(推荐)
/api/v1/users
/api/v2/users
请求头版本控制
GET /api/users
Accept: application/vnd.myapi.v1+json
查询参数版本控制
GET /api/users?version=1
请求和响应格式
请求示例
POST /api/v1/users
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"age": 30
}
成功响应示例
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"age": 30,
"createdAt": "2025-12-15T10:00:00Z"
}
响应结构
{
"status": "success",
"code": 200,
"data": {
"id": 1,
"name": "John Doe"
},
"message": "User retrieved successfully"
}
HTTP 状态码
2xx 成功
200 OK 请求成功
201 Created 资源创建成功
204 No Content 请求成功但无返回内容
3xx 重定向
301 Moved Permanently 永久重定向
302 Found 临时重定向
304 Not Modified 资源未修改
4xx 客户端错误
400 Bad Request 请求格式错误
401 Unauthorized 需要身份验证
403 Forbidden 无权限访问
404 Not Found 资源不存在
409 Conflict 请求冲突
422 Unprocessable Entity 请求格式正确但包含语义错误
429 Too Many Requests 请求过于频繁
5xx 服务器错误
500 Internal Server Error 服务器内部错误
502 Bad Gateway 网关错误
503 Service Unavailable 服务不可用
错误处理
统一的错误响应格式
{
"status": "error",
"code": 400,
"error": {
"type": "ValidationError",
"message": "Invalid input",
"details": [
{
"field": "email",
"message": "Invalid email format"
},
{
"field": "age",
"message": "Age must be at least 18"
}
]
}
}
错误处理最佳实践
// Express.js 示例
app.post('/api/v1/users', (req, res) => {
try {
// 验证输入
if (!req.body.email) {
return res.status(400).json({
status: 'error',
code: 400,
error: {
type: 'ValidationError',
message: 'Email is required'
}
});
}
// 处理请求
const user = createUser(req.body);
res.status(201).json({
status: 'success',
code: 201,
data: user
});
} catch (error) {
res.status(500).json({
status: 'error',
code: 500,
error: {
type: 'InternalServerError',
message: 'An unexpected error occurred'
}
});
}
});
分页和过滤
分页
GET /api/v1/users?page=1&limit=10
GET /api/v1/users?offset=0&limit=10
响应示例
{
"status": "success",
"data": [...],
"pagination": {
"page": 1,
"limit": 10,
"total": 100,
"totalPages": 10
}
}
过滤和排序
GET /api/v1/users?status=active&sort=name&order=asc
GET /api/v1/users?role=admin&createdAfter=2025-01-01
身份验证和授权
JWT 身份验证
// 登录端点
POST /api/v1/auth/login
{
"email": "user@example.com",
"password": "password123"
}
// 响应
{
"status": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"expiresIn": 3600
}
}
// 使用 token 访问受保护的资源
GET /api/v1/users/me
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
速率限制
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1640000000
API 文档
使用 OpenAPI/Swagger
openapi: 3.0.0
info:
title: User API
version: 1.0.0
paths:
/api/v1/users:
get:
summary: Get all users
parameters:
- name: page
in: query
schema:
type: integer
responses:
'200':
description: List of users
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
post:
summary: Create a new user
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UserInput'
responses:
'201':
description: User created
向后兼容性
版本控制策略
- 添加新字段 - 安全,客户端可以忽略
- 重命名字段 - 保留旧字段,添加新字段
- 删除字段 - 先弃用,后删除
- 更改字段类型 - 创建新版本
弃用策略
HTTP/1.1 200 OK
Deprecation: true
Sunset: Sun, 31 Dec 2025 23:59:59 GMT
Link: </api/v2/users>; rel="successor-version"
安全最佳实践
- 使用 HTTPS - 加密传输
- 验证输入 - 防止注入攻击
- 实施速率限制 - 防止滥用
- 使用 CORS - 控制跨域访问
- 实施身份验证 - 保护敏感资源
- 记录和监控 - 追踪异常活动
- 定期更新依赖 - 修复安全漏洞
性能优化
- 使用缓存 - 减少数据库查询
- 分页 - 限制返回数据量
- 字段选择 - 只返回需要的字段
- 异步处理 - 长时间操作使用后台任务
- 数据库优化 - 索引、查询优化
API 设计检查清单
- 使用 RESTful 原则
- 一致的 URL 设计
- 适当的 HTTP 方法
- 正确的状态码
- 统一的错误格式
- 版本控制
- 身份验证和授权
- 速率限制
- 完整的文档
- 向后兼容性
- 安全措施
- 性能优化
总结
设计好的 API 需要考虑多个方面,包括可用性、安全性、性能和可维护性。遵循这些最佳实践能帮助你创建高质量的 API,提供更好的开发者体验。