项目文件夹

文件
2026-07-13 12:34:57 +08:00

264 行
5.3 KiB
Markdown

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# REST API 统一响应格式
MyBoot 框架提供了统一的 REST API 响应格式封装,确保所有 API 返回一致的格式。
## 响应格式结构
### 成功响应
```json
{
"success": true,
"code": 200,
"message": "操作成功",
"data": {
// 实际业务数据
}
}
```
### 错误响应
```json
{
"success": false,
"code": 422,
"message": "参数校验失败",
"data": {
"fieldErrors": [
{
"field": "username",
"message": "用户名长度必须在3-20个字符之间"
}
]
}
}
```
## 使用方法
### 1. 自动格式化(推荐)
默认情况下,框架会自动将所有路由的响应包装为统一格式。你只需要在路由函数中返回业务数据即可:
```python
from myboot.core.decorators import get, post
from myboot.core.application import app
@get('/users')
def get_users():
"""获取用户列表"""
users = [{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]
return {"users": users} # 自动包装为统一格式
```
实际返回:
```json
{
"success": true,
"code": 200,
"message": "操作成功",
"data": {
"users": [
{ "id": 1, "name": "张三" },
{ "id": 2, "name": "李四" }
]
}
}
```
### 2. 手动使用响应包装器
如果你需要自定义响应消息,可以使用响应包装器:
```python
from myboot.web.response import response
@get('/users/{user_id}')
def get_user(user_id: int):
"""获取单个用户"""
user = {"id": user_id, "name": "张三"}
# 使用响应包装器
return response.success(
data=user,
message="查询成功",
code=200
)
```
### 3. 便捷方法
响应包装器提供了多个便捷方法:
```python
from myboot.web.response import response
# 创建成功(201
@post('/users')
def create_user(name: str, email: str):
user = create_user_service(name, email)
return response.created(data=user, message="用户创建成功")
# 更新成功
@put('/users/{user_id}')
def update_user(user_id: int, name: str):
user = update_user_service(user_id, name)
return response.updated(data=user, message="用户更新成功")
# 删除成功
@delete('/users/{user_id}')
def delete_user(user_id: int):
delete_user_service(user_id)
return response.deleted(message="用户删除成功")
# 分页响应
@get('/users')
def get_users(page: int = 1, size: int = 10):
users, total = get_users_service(page, size)
return response.pagination(
data=users,
total=total,
page=page,
size=size,
message="查询成功"
)
```
## 配置选项
### 启用/禁用自动格式化
在配置文件中设置:
```yaml
server:
response_format:
enabled: true # 是否启用自动格式化
exclude_paths: # 排除的路径(这些路径不会自动格式化)
- "/custom/path"
- "/another/path"
```
或者在代码中(通过配置参数):
```python
app = Application(
name="My App"
)
# 配置在 config.yaml 中设置:
# server:
# response_format:
# enabled: true
# exclude_paths:
# - "/custom/path"
```
### 默认排除的路径
以下路径默认不会被格式化(系统路径和文档路径):
- `/docs`
- `/openapi.json`
- `/redoc`
- `/health`
- `/health/ready`
- `/health/live`
## 异常响应格式
框架已经统一了异常响应格式,所有异常都会自动返回统一格式:
### 验证错误(422
```json
{
"success": false,
"code": 422,
"message": "Validation Error",
"data": {
"fieldErrors": [
{
"field": "username",
"message": "用户名格式不正确"
}
]
}
}
```
### HTTP 错误(4xx, 5xx
```json
{
"success": false,
"code": 404,
"message": "HTTP Error",
"data": {}
}
```
### 服务器错误(500
```json
{
"success": false,
"code": 500,
"message": "Internal Server Error",
"data": {
"type": "ExceptionClassName"
}
}
```
## 注意事项
1. **已经是统一格式的响应不会被重复包装**:如果你手动返回统一格式的响应,中间件会检测并直接返回。
2. **非 JSON 响应不会格式化**:只有 `JSONResponse` 类型的响应会被格式化。
3. **排除路径不会被格式化**:配置在排除列表中的路径不会被自动格式化,适用于需要返回原始格式的接口。
4. **中间件执行顺序**:响应格式化中间件是最后添加的,因此会最先执行(FastAPI 中间件是 LIFO)。
## 示例代码
完整示例:
```python
from myboot.core.application import Application
from myboot.core.decorators import get, post, put, delete
from myboot.web.response import response
app = Application(name="My API")
# 自动格式化
@get('/users')
def get_users():
return {"users": [...]} # 自动包装
# 手动格式化(自定义消息)
@get('/users/{user_id}')
def get_user(user_id: int):
user = get_user_by_id(user_id)
return response.success(data=user, message="查询成功")
# 创建操作
@post('/users')
def create_user(name: str, email: str):
user = create_user(name, email)
return response.created(data=user, message="用户创建成功")
# 分页
@get('/posts')
def get_posts(page: int = 1, size: int = 10):
posts, total = get_posts_paged(page, size)
return response.pagination(
data=posts,
total=total,
page=page,
size=size
)
```