前言

在设计API返回内容时,通常需要与前端约定好API返回响应体内容的格式。这样方便前端进行数据反序列化时相应的解析处理,也方便其它服务调用。不同公司有不同的响应内容规范要求,这里以常见的JSON响应体为例:

{
"code": 200,
"data": {
"content": "this is /a/1"
},
"msg": "success"
}

code字段

code状态码主要用于表示错误类型区间状态码。如果设计比较简单,可以直接使用HTTP的状态码。如果是一个大型系统,也可以设计一套自定义的状态码。比如:

from enum import Enum

class BizStatus(Enum):
# custom status code
OK = 200
BadRequestA1 = 4001 # 请求参数异常-A情况
BadRequestA2 = 4002 # 请求参数异常-B情况

message字段

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

data字段

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

示例代码

以下代码定义了一个JSON响应类,api在返回的时候需要引用这个响应类。除此之外,还对404和一般异常做了统一处理,当出现这两类异常时,也会返回JSON结构的响应体。

from flask import Flask, request, jsonify, make_response
from http import HTTPStatus API_KEY_SVCA = "flask_unify_response" app = Flask(__name__) class JsonResponse:
"""A class to represent a JSON response."""
def __init__(
self, code: HTTPStatus = HTTPStatus.OK, msg: str = "success", data=None
):
self.code = code
self.msg = msg
self.data = data def to_dict(self):
return {
"code": self.code.value,
"msg": self.msg,
"data": self.data,
} def to_json(self):
return jsonify(self.to_dict()) def response(self):
response = make_response(self.to_json(), self.code.value)
response.headers["Content-Type"] = "application/json"
return response @app.errorhandler(404)
def error_handler_not_found(error):
req_method = request.method
req_path = request.path
return JsonResponse(
code=HTTPStatus.NOT_FOUND,
msg=f"{req_method} {req_path} Not Found",
).response() @app.errorhandler(Exception)
def error_handler_generic(error):
req_method = request.method
req_path = request.path
return JsonResponse(
code=HTTPStatus.INTERNAL_SERVER_ERROR,
msg=f"Internal Server Error. {req_method} {req_path}",
data={"error": str(error)},
).response() @app.get("/a/1")
def apitest_a1():
return JsonResponse(
code=HTTPStatus.OK, msg="success", data={"content": "this is /a/1"}
).response() @app.get("/a/2")
def apitest_a2():
raise Exception("exception in a/2") if __name__ == "__main__":
app.run(host="127.0.0.1", port=8001)

客户端请求测试:

$ curl -s http://127.0.0.1:8001/a/1 | python3 -m json.tool
{
"code": 200,
"data": {
"content": "this is /a/1"
},
"msg": "success"
} $ 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"
}

[flask]统一API响应格式的更多相关文章

  1. aspnet core 全局模型验证,统一api响应

    上手就来 新建一个模型验证过滤器,其中ApiResp是自定义的统一响应类. public class VldFilter:IActionFilter { /// <summary> /// ...

  2. 使用fastjson统一序列化响应格式

    摘要:其实很简单的处理方式,只不够优雅,或者说没有找到fastjson为其提供便捷的处理方式.因此记录下处理该问题的过程. 目标:将所有api请求,即响应为APPLICATION_JSON的内容做统一 ...

  3. 自定义统一api返回json格式(app后台框架搭建三)

    在统一json自定义格式的方式有多种:1,直接重写@reposeBody的实现,2,自定义一个注解,自己去解析对象成为json字符串进行返回 第一种方式,我就不推荐,想弄得的话,可以自己去研究一下源码 ...

  4. WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证

    为什么还要写这类文章?因为我看过网上很多讲解的都不够全面,而本文结合实际工作讲解了swaggerui文档,统一响应格式,异常处理,权限验证等常用模块,并提供一套完善的案例源代码,在实际工作中可直接参考 ...

  5. spring boot / cloud (二) 规范响应格式以及统一异常处理

    spring boot / cloud (二) 规范响应格式以及统一异常处理 前言 为什么规范响应格式? 我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队 ...

  6. SpringBoot06 统一响应格式

    1 要求 每个请求成功后,后台返回的响应格式都是一致的,例如: 2 创建一个视图模型 该模型用于格式化响应数据 package cn.xiangxu.springboottest.model.data ...

  7. 001-RESTful服务最佳实践-RestFul准则、HTTP动词表示含义、合理的资源命名、响应格式XML和JSON

    一.概述 因为REST是一种架构风格而不是严格的标准,所以它可以灵活地实现.由于这种灵活性和结构自由度,对设计最佳实践也有很大的差异. API的方向是从应用程序开发人员的角度考虑设计选择. 幂等性 不 ...

  8. spring boot:使接口返回统一的RESTful格式数据(spring boot 2.3.1)

    一,为什么要使用REST? 1,什么是REST? REST是软件架构的规范体系,它把资源的状态用URL进行资源定位, 以HTTP动作(GET/POST/DELETE/PUT)描述操作 2,REST的优 ...

  9. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  10. API响应

    保证API响应的正确性,就是你需要做的大部分工作.postman的response viewer部分会协助你完成该工作且使其变得简单. 一个API的响应包含body,headers,响应状态码.pos ...

随机推荐

  1. [FAQ] Composer, Content-Length mismatch

    1. $ composer config repos.packagist composer https://php.cnpkg.org$ composer config cache-files-max ...

  2. cs61a回顾

    从1月25开始到2.20,完成第一个项目hog. 总结让自己进度慢的主观因素: 妄图一次阅读掌握所有知识:违反了<为什么学生不喜欢上学>中大脑不是用来思考的,它的真正作用在于使你避免思考的 ...

  3. SQL 多表关联更新语句

    A表WHERE条件来自B表查询结果集 UPDATE a SET a.is_sync = 0 FROM A表 a LEFT JOIN B表 b ON a.order_id = b.order_id AN ...

  4. h5开发,原生开发,混合开发

    这里做一点对h5开发,原生开发,混合开发的笔记,记一点更新一点: 一.h5开发:html,css和js编写页面和业务逻辑. 1..页面栈上,h5通过history来管理回退或者前进.vue通过配置路由 ...

  5. SAP集成技术(十二)SAP PO

    集成工作的一个重要部分是基于流程的集成,而在SAP环境中实现接口需求的众所周知的产品是SAP Process Orchestration(以下简称SAP PO). 现代集成架构通常使用中央系统来控制和 ...

  6. 80x86汇编—分支循环程序设计

    文章目录 查表法: 实现16进制数转ASCII码显示 计算AX的绝对值 判断有无实根 地址表形成多分支 从100,99,...,2,1倒序累加 输入一个字符,然后输出它的二进制数 大小写转换 大写转小 ...

  7. 版本管理工具 nvm WIN版

    nvm -h //查看nvm的指令 nvm list //查看本地已经安装的node版本列表 nvm list available //查看可以安装的node版本 nvm install latest ...

  8. 数据库中存储bool对象的数据,使用Bit和Integer有什么区别,性能上有多大的差异

    在数据库中存储布尔(Boolean)值时,常见的两种选择是使用 BIT 类型或 INTEGER 类型.两者在存储.性能和使用上的区别如下: 1. BIT 类型 存储:BIT 类型专门用于存储布尔值.通 ...

  9. Istio(八):istio安全之认证,启用mTLS

    目录 一.模块概览 二.系统环境 三.istio认证 3.1 证书创建与轮换 3.2 对等认证和请求认证 3.2.1 对等认证 3.2.2 请求认证 3.3 mTLS 3.3.1 双向 TLS 3.3 ...

  10. JS 监听用户页面访问&页面关闭并进行数据上报操作

    JS 监听用户页面访问&页面关闭操作并进行数据上报 前言 最近在做安全方面的项目,有个需求是在用户访问页面和关闭页面的时候,发送对应的数据. 刚拿到需求的时候,觉得没啥东西,init 的时候发 ...