Files
WonderQ-Project/WonderQ-Admin/app/api_response.py
duanshuwen e082bd2d98 feat(api): 实现三端统一的JSON API响应契约
- 新增`api_response.py`统一响应封装工具类,提供标准成功/错误响应构造方法
- 重构WonderQ-Admin全局异常处理器,将所有异常转换为标准响应格式
- 修改所有公共和管理端接口的返回逻辑,统一使用`code`(与HTTP状态码一致)、`msg`和`data`的三层结构
- 新增`api-response-contract.md`文档,定义完整的三端统一JSON响应规范
- 更新所有领域API文档,明确业务数据需位于`data`字段内,补充响应格式说明
- 为WonderQ-MiniAPP和WonderQ-Admin-UI新增响应解析逻辑和类型定义,自动完成协议校验和错误处理
- 更新所有测试用例,适配新的响应结构确保接口符合契约要求
- 新增`module-config-api.md`模块配置API文档,补充站点模块配置的接口约定
- 更新项目README文档,调整文档分类顺序将响应契约置于首位
2026-08-19 22:02:20 +08:00

40 lines
1.2 KiB
Python

from collections.abc import Mapping
from typing import Any
from fastapi.responses import JSONResponse
def success_response(data: Any, *, status_code: int = 200) -> JSONResponse:
return JSONResponse(
status_code=status_code,
content={"code": status_code, "msg": "success", "data": data},
)
def error_response(
status_code: int,
message: str,
*,
error_code: str | None = None,
details: Any = None,
) -> JSONResponse:
content: dict[str, Any] = {
"code": status_code,
"msg": message,
"data": None,
}
if error_code:
content["errorCode"] = error_code
if details:
content["details"] = details
return JSONResponse(status_code=status_code, content=content)
def exception_parts(detail: Any) -> tuple[str, str | None, Any]:
if isinstance(detail, Mapping):
message = detail.get("msg") or detail.get("message") or "请求失败"
raw_code = detail.get("errorCode") or detail.get("code")
error_code = raw_code if isinstance(raw_code, str) else None
return str(message), error_code, detail.get("details")
return str(detail or "请求失败"), None, None