Skip to content
On this page

封装统一格式返回工具

当开发后端接口时,一个重要的任务是定义和封装统一的返回格式。在这方面,FastAPI 是一个强大而灵活的框架,可以帮助我们快速构建高性能的 Web 应用程序。

在后端开发中,封装统一的返回格式有以下几个好处:

  1. 规范性:统一的返回格式使得接口返回的数据具有一致的结构,便于前端或其他服务端进行解析和处理。这样可以提高开发团队成员之间的协作和沟通效率,降低开发和维护的难度。

  2. 统一错误处理:通过封装统一的返回格式,可以统一处理和包装异常信息。无论是系统级错误还是业务逻辑错误,都可以通过统一的返回格式进行标识和传递,使得错误处理更加方便和一致。

  3. 安全性:通过统一的返回格式,可以屏蔽敏感数据,例如密码、私密信息等,避免将敏感数据直接返回给客户端或其他服务端,提高系统的安全性。

  4. 可扩展性:通过封装统一的返回格式,可以方便地进行扩展和调整,例如在返回格式中添加额外的元数据、错误码、状态信息等,以满足不同的业务需求或协议要求。

  5. 用户体验:统一的返回格式可以提供一致的用户体验,无论是成功响应还是异常情况,用户都可以更好地理解和处理返回的数据。

定义统一响应类

涉及文件 app/common/response.py

python
from enum import Enum  
from typing import Optional, Any  
  
from fastapi.responses import JSONResponse  
  
from pydantic import BaseModel  
  
  
class APIResponse(BaseModel):  
    """ API 响应模型 """   
    code: int  
    msg: str  
    data: Optional[Any]  
  
class APICode(Enum):  
    """ API 响应状态码  """
    RUNTIME_ERROR = {'code': 500, 'msg': 'Runtime Error'}  
    SUCCESS = {'code': 200, 'msg': 'Success'}  
    INVALID_PARAMS = {'code': 400, 'msg': 'Invalid Params'}  
    USER_NOT_FOUND = {'code': 404, 'msg': 'User Not Found'}  
    USERNAME_EXISTED = {'code': 200, 'msg': 'Username Existed'}  
  
    @property  
    def code(self) -> int:  
        return self.value.get('code')  
  
    @property  
    def msg(self) -> str:  
        return self.value.get('msg')

APIResponse 继承于 pydantic.BaseModel,里面定义了 3 个字段,分别如下

  • code:状态码,200、400、500等;
  • msg:返回信息
  • data:如果需要返回数据,则包含此字段

APICode 是一个枚举类,可以定义一些返回的 code、msg,在所有需要返回 APIResponse 的地方全部从此类中选取 code、msg,方便后期统一管理。

使用场景

python
@staticmethod  
@router.get('/users/id/{user_id}', response_model=APIResponse)  
async def get_user(user_id: int, user_service: UserService = Depends(get_user_service)):  
    user = await user_service.query_user(user_id)  
    return APIResponse(code=APICode.SUCCESS.code, msg=APICode.SUCCESS.msg, data=user)

controller 层可以直接返回 APIResponse 对象,code、msg 从事先定义好的 APICode 中获取。

Released under the MIT License.