主要更新: 1. 后端核心底座完成 (M1-M6): - 健康检查、指标监控、分布式锁 - 事件总线、队列系统、事务管理 - 安全守卫、多租户隔离、存储适配器 - 审计日志、配置管理、多语言支持 2. 前端迁移到 Ant Design Vue: - 从 Element Plus 迁移到 Ant Design Vue - 完善 system 模块 (role/menu/dept) - 修复依赖和配置问题 3. 文档完善: - AI 开发工作流文档 - 架构约束和开发规范 - 项目进度跟踪 4. 其他改进: - 修复编译错误和类型问题 - 完善测试用例 - 优化项目结构
505 lines
8.3 KiB
Markdown
505 lines
8.3 KiB
Markdown
# RESTful API 设计规范
|
||
|
||
::: info API 设计规范
|
||
|
||
本文档定义了 wwjcloud 框架的 RESTful API 设计规范,确保 API 的一致性、可读性和可维护性。
|
||
|
||
:::
|
||
|
||
## 基本原则
|
||
|
||
### 🎯 设计原则
|
||
|
||
- **资源导向**:API 应该围绕资源进行设计
|
||
- **无状态**:每个请求都应该包含完整的信息
|
||
- **统一接口**:使用标准的 HTTP 方法
|
||
- **可缓存**:支持缓存机制
|
||
- **分层系统**:支持分层架构
|
||
|
||
### 📝 命名规范
|
||
|
||
- **URL 使用小写字母**:`/api/member/list`
|
||
- **单词间使用连字符**:`/api/user-profile`
|
||
- **避免使用下划线**:不推荐 `/api/user_profile`
|
||
- **使用复数形式**:`/api/members` 而不是 `/api/member`
|
||
|
||
## HTTP 方法
|
||
|
||
### 🔍 GET - 获取资源
|
||
|
||
**用途:** 获取资源列表或单个资源
|
||
|
||
```http
|
||
# 获取资源列表
|
||
GET /api/members
|
||
|
||
# 获取单个资源
|
||
GET /api/members/123
|
||
|
||
# 获取资源的子资源
|
||
GET /api/members/123/orders
|
||
|
||
# 查询参数
|
||
GET /api/members?page=1&size=10&status=active
|
||
```
|
||
|
||
**响应示例:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "获取成功",
|
||
"data": {
|
||
"list": [...],
|
||
"total": 100,
|
||
"page": 1,
|
||
"size": 10
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
### ➕ POST - 创建资源
|
||
|
||
**用途:** 创建新资源
|
||
|
||
```http
|
||
# 创建资源
|
||
POST /api/members
|
||
|
||
# 请求体
|
||
{
|
||
"username": "john_doe",
|
||
"email": "john@example.com",
|
||
"status": 1
|
||
}
|
||
```
|
||
|
||
**响应示例:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "创建成功",
|
||
"data": {
|
||
"id": 123,
|
||
"username": "john_doe",
|
||
"email": "john@example.com",
|
||
"status": 1,
|
||
"create_time": 1640995200
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
### ✏️ PUT - 更新资源
|
||
|
||
**用途:** 完整更新资源
|
||
|
||
```http
|
||
# 更新资源
|
||
PUT /api/members/123
|
||
|
||
# 请求体
|
||
{
|
||
"username": "john_doe_updated",
|
||
"email": "john_updated@example.com",
|
||
"status": 1
|
||
}
|
||
```
|
||
|
||
**响应示例:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "更新成功",
|
||
"data": {
|
||
"id": 123,
|
||
"username": "john_doe_updated",
|
||
"email": "john_updated@example.com",
|
||
"status": 1,
|
||
"update_time": 1640995200
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
### 🔄 PATCH - 部分更新
|
||
|
||
**用途:** 部分更新资源
|
||
|
||
```http
|
||
# 部分更新资源
|
||
PATCH /api/members/123
|
||
|
||
# 请求体
|
||
{
|
||
"status": 0
|
||
}
|
||
```
|
||
|
||
**响应示例:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "更新成功",
|
||
"data": {
|
||
"id": 123,
|
||
"status": 0,
|
||
"update_time": 1640995200
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
### 🗑️ DELETE - 删除资源
|
||
|
||
**用途:** 删除资源
|
||
|
||
```http
|
||
# 删除资源
|
||
DELETE /api/members/123
|
||
|
||
# 批量删除
|
||
DELETE /api/members?ids=123,124,125
|
||
```
|
||
|
||
**响应示例:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "删除成功",
|
||
"data": null,
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
## URL 设计
|
||
|
||
### 📋 资源命名
|
||
|
||
**使用名词而非动词:**
|
||
|
||
```http
|
||
# ✅ 正确
|
||
GET /api/members
|
||
POST /api/members
|
||
PUT /api/members/123
|
||
DELETE /api/members/123
|
||
|
||
# ❌ 错误
|
||
GET /api/getMembers
|
||
POST /api/createMember
|
||
PUT /api/updateMember
|
||
DELETE /api/deleteMember
|
||
```
|
||
|
||
### 🔗 嵌套资源
|
||
|
||
**表示资源间的关系:**
|
||
|
||
```http
|
||
# 获取用户的订单
|
||
GET /api/members/123/orders
|
||
|
||
# 获取用户的特定订单
|
||
GET /api/members/123/orders/456
|
||
|
||
# 为用户创建订单
|
||
POST /api/members/123/orders
|
||
```
|
||
|
||
### 🔍 查询参数
|
||
|
||
**用于过滤、排序、分页:**
|
||
|
||
```http
|
||
# 过滤
|
||
GET /api/members?status=active&type=vip
|
||
|
||
# 排序
|
||
GET /api/members?sort=create_time&order=desc
|
||
|
||
# 分页
|
||
GET /api/members?page=1&size=10
|
||
|
||
# 搜索
|
||
GET /api/members?keyword=john
|
||
|
||
# 组合使用
|
||
GET /api/members?status=active&page=1&size=10&sort=create_time&order=desc
|
||
```
|
||
|
||
## 状态码规范
|
||
|
||
### ✅ 成功状态码
|
||
|
||
```http
|
||
200 OK # 请求成功
|
||
201 Created # 资源创建成功
|
||
204 No Content # 请求成功,无返回内容
|
||
```
|
||
|
||
### ❌ 客户端错误
|
||
|
||
```http
|
||
400 Bad Request # 请求参数错误
|
||
401 Unauthorized # 未授权访问
|
||
403 Forbidden # 禁止访问
|
||
404 Not Found # 资源不存在
|
||
405 Method Not Allowed # 方法不允许
|
||
409 Conflict # 资源冲突
|
||
422 Unprocessable Entity # 请求格式正确但语义错误
|
||
```
|
||
|
||
### 🔧 服务器错误
|
||
|
||
```http
|
||
500 Internal Server Error # 服务器内部错误
|
||
502 Bad Gateway # 网关错误
|
||
503 Service Unavailable # 服务不可用
|
||
```
|
||
|
||
## 请求头规范
|
||
|
||
### 📋 常用请求头
|
||
|
||
```http
|
||
# 内容类型
|
||
Content-Type: application/json
|
||
|
||
# 授权信息
|
||
Authorization: Bearer <token>
|
||
|
||
# 接受的内容类型
|
||
Accept: application/json
|
||
|
||
# 用户代理
|
||
User-Agent: wwjcloud-client/1.0.0
|
||
|
||
# 语言设置
|
||
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
|
||
```
|
||
|
||
### 🔐 认证头
|
||
|
||
```http
|
||
# JWT Token
|
||
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||
|
||
# API Key
|
||
X-API-Key: your-api-key
|
||
|
||
# 自定义认证
|
||
X-Auth-Token: your-auth-token
|
||
```
|
||
|
||
## 响应格式
|
||
|
||
### 📊 统一响应结构
|
||
|
||
```typescript
|
||
interface ApiResponse<T = any> {
|
||
code: number; // 状态码
|
||
message: string; // 消息
|
||
data: T; // 数据
|
||
timestamp: number; // 时间戳
|
||
}
|
||
```
|
||
|
||
### 📝 响应示例
|
||
|
||
**成功响应:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "操作成功",
|
||
"data": {
|
||
"id": 123,
|
||
"username": "john_doe",
|
||
"email": "john@example.com"
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
**错误响应:**
|
||
```json
|
||
{
|
||
"code": 400,
|
||
"message": "请求参数错误",
|
||
"data": null,
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
**列表响应:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "获取成功",
|
||
"data": {
|
||
"list": [
|
||
{
|
||
"id": 123,
|
||
"username": "john_doe",
|
||
"email": "john@example.com"
|
||
}
|
||
],
|
||
"total": 100,
|
||
"page": 1,
|
||
"size": 10
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
## 版本控制
|
||
|
||
### 🔢 版本策略
|
||
|
||
**URL 版本控制:**
|
||
|
||
```http
|
||
# 版本 1
|
||
GET /api/v1/members
|
||
|
||
# 版本 2
|
||
GET /api/v2/members
|
||
```
|
||
|
||
**请求头版本控制:**
|
||
|
||
```http
|
||
GET /api/members
|
||
Accept: application/vnd.wwjcloud.v1+json
|
||
```
|
||
|
||
### 📋 版本命名
|
||
|
||
- **主版本**:重大变更,不兼容
|
||
- **次版本**:新功能,向后兼容
|
||
- **修订版本**:Bug 修复,向后兼容
|
||
|
||
## 错误处理
|
||
|
||
### 🚨 错误响应格式
|
||
|
||
```json
|
||
{
|
||
"code": 400,
|
||
"message": "请求参数错误",
|
||
"data": {
|
||
"errors": [
|
||
{
|
||
"field": "email",
|
||
"message": "邮箱格式不正确"
|
||
},
|
||
{
|
||
"field": "username",
|
||
"message": "用户名不能为空"
|
||
}
|
||
]
|
||
},
|
||
"timestamp": 1640995200
|
||
}
|
||
```
|
||
|
||
### 📝 错误码规范
|
||
|
||
**业务错误码:**
|
||
```typescript
|
||
// 成功
|
||
200: '操作成功'
|
||
201: '创建成功'
|
||
|
||
// 客户端错误
|
||
400: '请求参数错误'
|
||
401: '未授权访问'
|
||
403: '禁止访问'
|
||
404: '资源不存在'
|
||
409: '资源冲突'
|
||
|
||
// 服务器错误
|
||
500: '服务器内部错误'
|
||
502: '网关错误'
|
||
503: '服务不可用'
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
### ✅ 推荐做法
|
||
|
||
1. **使用 HTTPS**:所有 API 都应该使用 HTTPS
|
||
2. **参数验证**:严格验证所有输入参数
|
||
3. **错误处理**:提供详细的错误信息
|
||
4. **文档化**:提供完整的 API 文档
|
||
5. **版本控制**:使用版本控制管理 API 变更
|
||
6. **限流控制**:实现 API 限流机制
|
||
7. **监控日志**:记录 API 调用日志
|
||
|
||
### ❌ 避免做法
|
||
|
||
1. **不要使用动词**:URL 应该使用名词
|
||
2. **不要暴露内部错误**:不要返回敏感的错误信息
|
||
3. **不要过度设计**:保持 API 简单易用
|
||
4. **不要忽略缓存**:合理使用缓存机制
|
||
5. **不要忽略安全**:实现适当的安全措施
|
||
|
||
## 示例
|
||
|
||
### 📋 完整的 API 示例
|
||
|
||
**会员管理 API:**
|
||
|
||
```http
|
||
# 获取会员列表
|
||
GET /api/v1/members?page=1&size=10&status=active
|
||
|
||
# 获取单个会员
|
||
GET /api/v1/members/123
|
||
|
||
# 创建会员
|
||
POST /api/v1/members
|
||
Content-Type: application/json
|
||
Authorization: Bearer <token>
|
||
|
||
{
|
||
"username": "john_doe",
|
||
"email": "john@example.com",
|
||
"status": 1
|
||
}
|
||
|
||
# 更新会员
|
||
PUT /api/v1/members/123
|
||
Content-Type: application/json
|
||
Authorization: Bearer <token>
|
||
|
||
{
|
||
"username": "john_doe_updated",
|
||
"email": "john_updated@example.com",
|
||
"status": 1
|
||
}
|
||
|
||
# 删除会员
|
||
DELETE /api/v1/members/123
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
## 下一步
|
||
|
||
::: tip 深入学习
|
||
|
||
1. **查看响应格式规范**:了解统一的响应格式
|
||
2. **阅读错误码规范**:了解错误码定义
|
||
3. **参考开发规范**:遵循开发规范
|
||
4. **查看最佳实践**:学习最佳实践
|
||
|
||
:::
|
||
|
||
::: warning 注意事项
|
||
|
||
- 严格遵循 RESTful 设计原则
|
||
- 保持 API 的一致性和可读性
|
||
- 提供完整的错误处理
|
||
- 实现适当的安全措施
|
||
|
||
::: |