Files
djangoadmin-wiki/DjangoAdmin_Tornado_NaiveVue/zh/volume7/api-response.md
T
2026-09-16 13:28:20 +08:00

163 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API响应规范
## 概述
统一使用 `R` 模块封装 API 响应,所有接口返回一致的 JSON 格式,便于前端统一处理。
:::tip 核心原则
- 所有接口必须通过 `R.ok()` 或 `R.failed()` 返回,禁止直接返回 dict
- 成功响应 `code=0`,失败响应 `code=1`
- 响应体始终包含 `code`、`data`、`msg`、`ok` 四个字段
:::
## 响应格式
### 成功响应
```json
{
"code": 0,
"data": { ... },
"msg": "操作成功",
"ok": true
}
```
### 失败响应
```json
{
"code": 1,
"data": null,
"msg": "错误信息",
"ok": false
}
```
### 分页响应
```json
{
"code": 0,
"data": {
"records": [ ... ],
"total": 100,
"size": 10,
"current": 1,
"pages": 10
},
"msg": "操作成功",
"ok": true
}
```
## R 模块使用方法
### R.ok() 成功响应
```python
from core import R
# 基础成功响应
return R.ok()
# 带数据的成功响应
return R.ok(data=user_info)
# 自定义提示消息
return R.ok(msg='添加成功')
# 附加额外字段(如 count)
return R.ok(data=result, count=total)
```
### R.failed() 失败响应
```python
# 基础失败响应
return R.failed()
# 自定义错误消息
return R.failed('岗位名称不能重复')
# 自定义错误码和消息
return R.failed(msg='未授权', code=401)
```
### R.page() 分页响应
```python
# 分页响应(由 BaseService.get_page 自动调用)
return R.page(data=records, total=100, current=1, size=10)
```
## 字段定义
| 字段 | 类型 | 说明 |
|------|------|------|
| `code` | int | 状态码:0=成功,1=失败,401=未认证,403=无权限 |
| `data` | any/null | 响应数据,失败时为 null |
| `msg` | string | 提示消息 |
| `ok` | boolean | 是否成功 |
## 状态码规范
| 状态码 | 含义 | 使用场景 |
|--------|------|---------|
| 0 | 成功 | 操作成功 |
| 1 | 失败 | 业务逻辑失败(如参数校验、唯一性冲突) |
| 401 | 未认证 | token 缺失或过期 |
| 403 | 无权限 | 用户无对应权限 |
| 404 | 资源不存在 | 请求的资源未找到 |
| 422 | 验证错误 | Pydantic 参数校验失败 |
| 500 | 服务器错误 | 未捕获的异常 |
:::tip 错误码与 HTTP 状态码
业务错误码(code 字段)始终为 0 或 1,HTTP 状态码始终为 200。401/403/422 等仅在全局异常处理器中使用,常规业务错误统一返回 `code=1`。
:::
## 在 Endpoint 中使用
```python
from core import response as R
# 查询详情:service 返回 dict,Handler 包 R.ok
class PositionDetailHandler(BaseHandler):
async def get(self, id):
result = position_service.get_detail(id)
return R.ok(self, data=result)
# 添加记录:service 直接返回 R 对象
class PositionAddHandler(BaseHandler):
async def post(self):
return await position_service.add(self)
# 删除记录:service 直接返回 R 对象
class PositionDeleteHandler(BaseHandler):
async def delete(self, id):
return await position_service.delete(self, id)
```
:::tip 响应封装层级
- **分页/列表查询**:service 返回 `R.page()`
- **详情查询**:service 返回 dict/None,Handler 包 `R.ok(self, data=result)`
- **写操作(增/删/改/状态)**:service 直接返回 `R` 对象
:::
## Pydantic 验证错误响应
Pydantic 验证错误由全局 `RequestValidationError` 处理器自动转换为标准格式:
```json
{
"code": 1,
"data": null,
"msg": "name: 字段不能为空 / status: 输入值超出范围",
"ok": false
}
```
## 总结
API 响应规范通过 `R` 模块统一封装:`R.ok()` 返回成功、`R.failed()` 返回失败、`R.page()` 返回分页。所有响应保持 `{code, data, msg, ok}` 四字段结构,HTTP 状态码始终为 200。业务层错误统一用 `code=1`,前端只需判断 `ok` 字段即可。