翼度科技»论坛 编程开发 python 查看内容

[flask]统一API响应格式

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
前言

在设计API返回内容时,通常需要与前端约定好API返回响应体内容的格式。这样方便前端进行数据反序列化时相应的解析处理,也方便其它服务调用。不同公司有不同的响应内容规范要求,这里以常见的JSON响应体为例:
  1. {
  2.     "code": 200,
  3.     "data": {
  4.         "content": "this is /a/1"
  5.     },
  6.     "msg": "success"
  7. }
复制代码
code字段

code状态码主要用于表示错误类型区间状态码。如果设计比较简单,可以直接使用HTTP的状态码。如果是一个大型系统,也可以设计一套自定义的状态码。比如:
  1. from enum import Enum
  2. class BizStatus(Enum):
  3.     # custom status code
  4.     OK = 200
  5.     BadRequestA1 = 4001  # 请求参数异常-A情况
  6.     BadRequestA2 = 4002  # 请求参数异常-B情况
复制代码
message字段

message 字段是对当前 code 状态码错误明细的补充说明。通常不同的code状态码会有不同的message描述信息。
data字段

data 值通常代表返回的响应体内容。
示例代码

以下代码定义了一个JSON响应类,api在返回的时候需要引用这个响应类。除此之外,还对404和一般异常做了统一处理,当出现这两类异常时,也会返回JSON结构的响应体。
  1. from flask import Flask, request, jsonify, make_response
  2. from http import HTTPStatus
  3. API_KEY_SVCA = "flask_unify_response"
  4. app = Flask(__name__)
  5. class JsonResponse:
  6.     """A class to represent a JSON response."""
  7.     def __init__(
  8.         self, code: HTTPStatus = HTTPStatus.OK, msg: str = "success", data=None
  9.     ):
  10.         self.code = code
  11.         self.msg = msg
  12.         self.data = data
  13.     def to_dict(self):
  14.         return {
  15.             "code": self.code.value,
  16.             "msg": self.msg,
  17.             "data": self.data,
  18.         }
  19.     def to_json(self):
  20.         return jsonify(self.to_dict())
  21.     def response(self):
  22.         response = make_response(self.to_json(), self.code.value)
  23.         response.headers["Content-Type"] = "application/json"
  24.         return response
  25. @app.errorhandler(404)
  26. def error_handler_not_found(error):
  27.     req_method = request.method
  28.     req_path = request.path
  29.     return JsonResponse(
  30.         code=HTTPStatus.NOT_FOUND,
  31.         msg=f"{req_method} {req_path} Not Found",
  32.     ).response()
  33. @app.errorhandler(Exception)
  34. def error_handler_generic(error):
  35.     req_method = request.method
  36.     req_path = request.path
  37.     return JsonResponse(
  38.         code=HTTPStatus.INTERNAL_SERVER_ERROR,
  39.         msg=f"Internal Server Error. {req_method} {req_path}",
  40.         data={"error": str(error)},
  41.     ).response()
  42. @app.get("/a/1")
  43. def apitest_a1():
  44.     return JsonResponse(
  45.         code=HTTPStatus.OK, msg="success", data={"content": "this is /a/1"}
  46.     ).response()
  47. @app.get("/a/2")
  48. def apitest_a2():
  49.     raise Exception("exception in a/2")
  50. if __name__ == "__main__":
  51.     app.run(host="127.0.0.1", port=8001)
复制代码
客户端请求测试:
  1. $ curl -s http://127.0.0.1:8001/a/1 | python3 -m json.tool{
  2.     "code": 200,
  3.     "data": {
  4.         "content": "this is /a/1"
  5.     },
  6.     "msg": "success"
  7. }$ curl -s http://127.0.0.1:8001/a/2 | python3 -m json.tool{    "code": 500,    "data": {        "error": "exception in a/2"    },    "msg": "Internal Server Error. GET /a/2"}$ curl -s http://127.0.0.1:8001/a/3 | python3 -m json.tool{    "code": 404,    "data": null,    "msg": "GET /a/3 Not Found"}
复制代码
来源:https://www.cnblogs.com/XY-Heruo/p/18257354
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具