API设计是后端开发的重要技能。本文将介绍API设计的最佳实践,帮助你构建高质量、易用的API。
1. RESTful设计原则
资源导向
# 好的设计
GET /api/users # 获取用户列表
GET /api/users/123 # 获取单个用户
POST /api/users # 创建用户
PUT /api/users/123 # 更新用户
PATCH /api/users/123 # 部分更新
DELETE /api/users/123 # 删除用户
# 不好的设计
GET /api/getUsers
POST /api/createUser
POST /api/updateUser
POST /api/deleteUser
HTTP方法
- GET:获取资源(幂等)
- POST:创建资源
- PUT:完整更新资源(幂等)
- PATCH:部分更新资源
- DELETE:删除资源(幂等)
HTTP状态码
# 2xx 成功
200 OK # 成功
201 Created # 创建成功
204 No Content # 删除成功
# 3xx 重定向
301 Moved Permanently
304 Not Modified
# 4xx 客户端错误
400 Bad Request # 请求错误
401 Unauthorized # 未认证
403 Forbidden # 无权限
404 Not Found # 资源不存在
409 Conflict # 资源冲突
422 Unprocessable # 验证失败
429 Too Many Requests # 限流
# 5xx 服务端错误
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
2. 请求与响应
请求格式
# 请求头
Content-Type: application/json
Authorization: Bearer token123
Accept: application/json
# 请求体(JSON)
{
"name": "Alice",
"email": "[email protected]",
"age": 30
}
# 查询参数
GET /api/users?page=1&limit=20&sort=name&order=asc
响应格式
# 成功响应
{
"code": 200,
"message": "success",
"data": {
"id": 123,
"name": "Alice",
"email": "[email protected]"
},
"timestamp": "2025-01-15T10:30:00Z"
}
# 分页响应
{
"code": 200,
"data": [...],
"pagination": {
"page": 1,
"limit": 20,
"total": 100,
"totalPages": 5
}
}
3. 认证与授权
JWT认证
# 登录获取Token
POST /api/auth/login
{
"username": "alice",
"password": "password123"
}
# 响应
{
"access_token": "eyJhbG...",
"refresh_token": "eyJhbG...",
"expires_in": 3600
}
# 使用Token
Authorization: Bearer eyJhbG...
OAuth2
# 授权码模式
1. 客户端跳转到授权服务器
2. 用户授权
3. 获取授权码
4. 用授权码换取access_token
4. 版本管理
# URL路径版本
/api/v1/users
/api/v2/users
# 请求头版本
Accept: application/vnd.myapi.v1+json
# 查询参数版本
/api/users?version=1
5. 错误处理
# 错误响应格式
{
"code": 400,
"message": "Validation Failed",
"errors": [
{
"field": "email",
"message": "Email格式不正确"
},
{
"field": "age",
"message": "年龄必须大于18"
}
]
}
# 全局错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(err.status || 500).json({
code: err.status || 500,
message: err.message || 'Internal Server Error',
errors: err.errors || []
});
});
6. 限流与安全
限流
# 令牌桶算法
# 每个用户每分钟100次请求
# 响应头
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1609459200
安全头
# 响应头
Content-Security-Policy: default-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
7. 文档规范
OpenAPI/Swagger
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/api/users:
get:
summary: 获取用户列表
parameters:
- name: page
in: query
schema:
type: integer
responses:
'200':
description: 成功
content:
application/json:
schema:
$ref: '#/components/schemas/UserList'
8. 最佳实践
- 使用名词而非动词:/users 而非 /getUsers
- 复数形式:/users 而非 /user
- 嵌套资源:/users/123/orders
- 过滤排序:查询参数
- 分页:page + limit
- 版本管理:URL或Header
- 统一响应格式:code + message + data
- 完善的错误处理:详细的错误信息
9. GraphQL替代方案
# GraphQL查询
query {
user(id: 123) {
name
email
posts {
title
createdAt
}
}
}
# 优势
- 按需查询
- 单一端点
- 强类型
- 自文档化
10. API测试
# Postman
# 可视化测试工具
# 自动化测试
# Jest + Supertest
const request = require('supertest');
const app = require('./app');
describe('GET /api/users', () => {
it('should return users list', async () => {
const res = await request(app)
.get('/api/users')
.expect(200);
expect(res.body.data).toBeInstanceOf(Array);
});
});
总结
好的API设计应该:
- 直观:URL语义清晰
- 一致:遵循统一规范
- 安全:认证、限流、安全头
- 文档完善:OpenAPI/Swagger
- 易于测试:自动化测试覆盖
📖 进阶学习:学习GraphQL、gRPC、以及API网关(Kong、APISIX)。