RESTful API 实践
安全性最佳实践
1. 身份验证和授权
// 使用 JWT Token 进行身份验证
GET /api/users/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
// API 响应包含用户权限检查
{
"success": true,
"data": {
"id": 123,
"name": "张三",
"role": "user"
}
}2. 输入验证
// 服务器端验证示例
POST /api/users
{
"email": "test@example.com",
"password": "123" // 密码太短
}
// 验证失败响应
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "密码长度至少为8位"
}
}3. HTTPS 和数据加密
- ✅ https://api.example.com/users
- ❌ http://api.example.com/users
性能优化实践
1. 数据分页
// 避免一次返回大量数据
GET /api/users?page=1&limit=20
{
"success": true,
"data": [...], // 只返回20条记录
"pagination": {
"currentPage": 1,
"totalPages": 50,
"totalItems": 1000
}
}
2. 字段过滤
// 只返回需要的字段
GET /api/users?fields=id,name,email
{
"success": true,
"data": [
{
"id": 1,
"name": "张三",
"email": "zhangsan@example.com"
// 不返回其他不需要的字段
}
]
}3. 缓存策略
// 使用缓存头 GET /api/users/123 Cache-Control: max-age=3600 // 缓存1小时 // 条件请求 GET /api/users/123 If-None-Match: "etag-value" // 304 Not Modified (数据未变化)
错误处理最佳实践
统一错误格式
{
"success": false,
"error": {
"code": "SPECIFIC_ERROR_CODE", // 机器可读的错误码
"message": "用户友好的错误信息", // 人类可读的错误信息
"details": {...}, // 详细错误信息(可选)
"timestamp": "2024-01-15T10:00:00Z"
}
}
常见错误码设计
const ERROR_CODES = {
// 4xx 客户端错误
'VALIDATION_ERROR': 400, // 数据验证失败
'UNAUTHORIZED': 401, // 未授权
'FORBIDDEN': 403, // 禁止访问
'NOT_FOUND': 404, // 资源不存在
'METHOD_NOT_ALLOWED': 405, // 方法不允许
'CONFLICT': 409, // 资源冲突
// 5xx 服务器错误
'INTERNAL_ERROR': 500, // 内部服务器错误
'SERVICE_UNAVAILABLE': 503 // 服务不可用
}API 文档化
使用标准化文档格式
推荐使用 OpenAPI (Swagger) 规范:
# swagger.yaml 示例
openapi: 3.0.0
info:
title: 用户管理 API
version: 1.0.0
description: 提供用户的增删改查功能
paths:
/api/users:
get:
summary: 获取用户列表
parameters:
- name: page
in: query
description: 页码
schema:
type: integer
default: 1
responses:
'200':
description: 成功
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
data:
type: array
items:
$ref: '#/components/schemas/User'
版本控制策略
URL 版本控制(推荐)
// 版本1
GET /api/v1/users
// 版本2(新增字段,保持向后兼容)
GET /api/v2/users
{
"id": 1,
"name": "张三",
"email": "zhangsan@example.com",
"avatar": "https://example.com/avatar.jpg" // 新增字段
}兼容性处理
// 保持向后兼容的策略
{
"deprecationWarning": "该 API 版本将在2024年6月1日后停止支持,请升级到 v2",
"data": {...}
}
实践练习
练习一:图书管理系统 API
设计一个简单的图书管理系统,包含以下功能:
需求分析
- 管理图书信息(标题、作者、ISBN、价格)
- 管理图书分类
- 支持图书的增删改查
- 支持按分类筛选图书
API 设计练习
请设计以下 API 端点:
// 你的任务:完善以下 API 设计
// 图书相关
GET /api/books // 获取图书列表
GET /api/books/{id} // 获取特定图书
POST /api/books // 创建新图书
PUT /api/books/{id} // 更新图书信息
DELETE /api/books/{id} // 删除图书
// 分类相关
GET /api/categories // 获取分类列表
GET /api/categories/{id}/books // 获取分类下的图书
示例数据结构:
{
"id": 1,
"title": "JavaScript 高级程序设计",
"author": "Nicholas C. Zakas",
"isbn": "9787115275790",
"price": 99.00,
"categoryId": 1,
"category": {
"id": 1,
"name": "编程技术"
},
"publishedDate": "2012-03-01",
"description": "深入理解JavaScript语言",
"stock": 50
}
练习任务
- 设计 API 文档:为每个端点编写详细的请求和响应示例
- 错误处理:设计各种错误情况的响应格式
- 数据验证:列出每个字段的验证规则
- 测试用例:编写测试每个 API 的 curl 命令
练习二:待办事项 API
创建一个待办事项管理 API:
功能要求
- 创建、查看、更新、删除待办事项
- 标记任务完成状态
- 按状态筛选任务
- 支持任务优先级
数据模型设计
{
"id": 1,
"title": "学习 RESTful API",
"description": "完成 API 教程的学习",
"status": "pending", // pending, completed, cancelled
"priority": "high", // low, medium, high
"dueDate": "2024-01-20",
"createdAt": "2024-01-15T08:00:00Z",
"updatedAt": "2024-01-15T08:00:00Z"
}
挑战任务
- 批量操作:设计批量更新任务状态的 API
- 搜索功能:支持按标题和描述搜索
- 统计信息:返回任务完成情况的统计数据
练习三:社交媒体 API
设计一个简化版社交媒体平台的 API:
核心功能
- 用户注册和登录
- 发布和查看动态
- 关注其他用户
- 点赞和评论
API 结构设计
// 用户相关
POST /api/auth/register // 用户注册
POST /api/auth/login // 用户登录
GET /api/users/profile // 获取个人资料
// 动态相关
GET /api/posts // 获取动态列表
POST /api/posts // 发布新动态
GET /api/posts/{id} // 获取特定动态
DELETE /api/posts/{id} // 删除动态
// 互动相关
POST /api/posts/{id}/like // 点赞动态
POST /api/posts/{id}/comments // 添加评论
GET /api/posts/{id}/comments // 获取评论列表
高级功能设计
- 关注系统:用户之间的关注关系
- 消息推送:新互动的通知机制
- 内容审核:敏感内容的过滤
