背景

目前鉴于前后端分离开发的流行,现在需要对后端接口返回json数据格式,做统一规范处理

特性要求

要求后端接口统一返回以下格式

{"code": "SUC0000","message": "成功","timestamp": 1669374903292,"data": null
}
code 接口响应状态码
message 接口返回信息
code 接口响应状态码
timestamp 时间戳
data 数据

总体设计实现

利用spring-web带有的控制器增强,@ControllerAdvice,统一包装controller接口的返回值

  1. 针对接口成功响应: @ControllerAdvice
  2. 针对接口异常响应: @ControllerAdvice + @ExceptionHandler

具体实现样例链接:统一接口包装返回实现

@ControllerAdvice
public class ResponseControllerAdviceImpl implements ResponseBodyAdvice<Object> {private ObjectMapper objectMapper = new ObjectMapper();@Overridepublic boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {GetMapping get = methodParameter.getMethodAnnotation(GetMapping.class);PostMapping post = methodParameter.getMethodAnnotation(PostMapping.class);PutMapping put = methodParameter.getMethodAnnotation(PutMapping.class);DeleteMapping delete = methodParameter.getMethodAnnotation(DeleteMapping.class);String[] methods = new String[0];if (get != null) {methods = get.value();}if (post != null) {methods = post.value();}if (put != null) {methods = put.value();}if (delete != null) {methods = delete.value();}return ArrayUtil.isNotEmpty(methods);}@Overridepublic Object beforeBodyWrite(Object data, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {// 保证后端统一接口返回操作 不影响 swagger.jsonMethod method = methodParameter.getMethod();if (method != null && "openapiJson".equals(method.getName())) {return data;}// 避免返回String类型报错if (data instanceof String) {try {return objectMapper.writeValueAsString(new SuccessTip<>((String) data));} catch (JsonProcessingException ignore) {}}return new SuccessTip<>(data);}
}

Q&A

1. 这里涉及到的知识点

答:这里其实就是单纯的API接口(controller)的返回值包装。所以一定设计到http的知识。
需要理解:HttpMessageConverter、Spring的api处理与返回的流程。

2. 返回String类型值报错

答:这里就是HttpMessageConverter处理流程过程中出现的错误。可调整HttpMessageConverter转换器链的顺序、去除StringHttpMessageConverter、针对string类型单独包装处理(本文采取方式

3. Springdoc使用统一包装导致swagger页面无api定义

答:这里主要是统一包装,将springdoc的swagger.json也包装了,格式变化,导致swagger无法解析json,出现页面无api定义!可参考具体实现样例中,关于springdoc的处理。修复swagger页面展示api无定义

浅谈后端接口统一及原理相关推荐

  1. 后端语言除了java_浅谈后端语言优缺点

    浅谈后端语言优缺点 兄弟连教育在前不久,回答了一个关于后端语言选型的问题,那么后端语言都有哪些,存在什么样的优缺点?因此兄弟连与大家分享一下心得. 语言优缺点 C/C++ C 语言虽然是非常贴近操作系 ...

  2. 【NXP DN 系列】浅谈 DPAA1 Software Architecture 工作原理

    浅谈 DPAA1 Software Architecture 工作原理 一.介绍 DPAA1 的主要目的是在片上系统( SOC )的 IO 部分内提供智能处理,以进行路由和管 理与流量相关的处理工作, ...

  3. php的解析别名,浅谈laravel aliases别名的原理

    在laravel发现有些类可以直接use 类名,就能使用了,例如use DB;就可以使用DB类了,问题是DB这个类并不在根命名空间,这里面实际就是用到了别名. 先通过如下例子来分析基本原理 建立如下文 ...

  4. 浅谈Charles抓取HTTPS原理及HTTP CONNECT

    浅谈Charles抓取HTTPS原理 在关于HTTPS,你需要知道的全部中,分析了HTTPS的安全通信过程,知道了HTTPS可以有效防止中间人攻击.但用过抓包工具的人都知道,比如Charles,Fid ...

  5. sql在insert的同时把某个字段返回来_项目实践:后端接口统一规范的同时,如何优雅得扩展规范?...

    推荐学习 春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 这是什么神仙面试宝典?半月看完25大专题,居然斩获阿里P7offer 前言 之前写过如何通过 ...

  6. 读进程和写进程同步设计_浅谈unix进程进程间通信IPC原理

    什么是进程进程间通信 进程间通信即为不同进程之间通信,进程同步是进程间通信的一种 unix进程间通信的分类有哪些 System V进程间通信方式包含: System V消息队列 System V信号量 ...

  7. Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》

    一.引言 倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,以大范围.高精度.高清晰的方式全面感知复杂场景,通过高效的数据采集设备及专业的数据处理流程生成的数据成果直观反映地物的外观.位置 ...

  8. 浅谈“面向接口编程” :依赖反转 IOC 与 DI (容器控制反转与依赖注入)

    IOC:Inversion of Control Containers and the Dependency Injection "Water" by Andy Huan, Mal ...

  9. 浅谈八木天线的特点、原理与制作调整

    原文地址:http://blog.sina.com.cn/s/blog_54c9ca5f0100dety.html 作为电磁换能元件,天线在整个无线电通信系统中位置十分重要,质量好坏直接影响着收发信距 ...

最新文章

  1. QEMU虚拟机关键源代码学习
  2. 宣武区政务网教育网的改造
  3. Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext
  4. 判断某一天是这一年的第多少天
  5. Acwing 216. Rainbow的信号
  6. 安装包损坏无法安装怎么办?关于更新big sur系统后软件下载无法安装问题的解答
  7. 一文讲清,MySQL数据库一行数据在磁盘上是怎么存储的?
  8. python安装方法3.8.2_Python(开发环境工具)v3.8.2 x32 官方win版
  9. 2004-2020年数学建模美赛O奖论文合集(免费)
  10. js html实体编码转换,字符串js编码转换成实体html编码的方法(防范XSS攻击)
  11. 【IDEA】IDEA怎么汉化汉化后怎么转回英文
  12. 向日葵控制端怎么传输文件给服务器,传送文件步骤有哪些?如何用向日葵实现远程传送文件?...
  13. 罗德矢量网络分析仪高效测试软件NSAT-1000
  14. 让笔记本的无线网卡指示灯不再狂闪的方法
  15. pythonend输出最后没有逗号_python不换行之end=与逗号的意思及用途
  16. c语言做绘图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  17. 最近超火的ChatGPT到底怎么样?体验完后我有哪些感受和思考?
  18. 【杂谈】给瑞典的曾先生:出门在外,低调行事
  19. [置顶] 不写周报才是一件很嘻哈的事
  20. Mongo与robomongo

热门文章

  1. access制作封装软件_标签打印软件如何批量打印产品标识卡
  2. iphone11pro市场价_iPhone11 Pro首发真机体验:花这一万元真的值吗?
  3. 每日一课 | Python综合案例实战
  4. 阿里巴巴员工爆料,研发工作真实感受
  5. 怎么制作微信表情包?这两种方法,亲测好用
  6. 【DP】 POJ 2955 Brackets 区间DP
  7. 一文带你学会使用java操作数据库(JDBC)
  8. 正则表达式匹配开头和结尾(^、$、[^指定字符])
  9. 外资银行将获准在华开展零售金融业务
  10. 表情和微表情数据集总结