分布式之API接口返回格式如何优雅设计?,苦熬一个月
#2000~2999 区间表示用户错误
#3000~3999 区间表示接口异常
这样前端开发人员在得到返回值后,**根据状态码就可以知道,大概什么错误**,再根据message相关的信息描述,**可以快速定位。**
### Message
这个字段相对理解比较简单,就是发生错误时,如何友好的进行提示。一般的设计是和code状态码一起设计,如
![](https://img-blog.csdnimg.cn/img_convert/73870344e5c470bb3b51878b0bab52be.png)再在枚举中定义,状态码
![](https://img-blog.csdnimg.cn/img_convert/709ddd0d22c5eedfad88ea97e73525f3.png)状态码和信息就会一一对应,比较好维护。
### Data
返回数据体,JSON格式,根据不同的业务又不同的JSON体。我们要设计一个返回体类Result
![](https://img-blog.csdnimg.cn/img_convert/4726cb5d281bded0f82f40ef7b7aba6d.png)## 控制层Controller
我们会在controller层处理业务请求,并返回给前端,以order订单为例
![](https://img-blog.csdnimg.cn/img_convert/9cc0cafc359defecc24e1b2bc5e6788b.png)我们看到在获得order对象之后,我们是用的**Result构造方法进行包装赋值**,然后进行返回。小伙伴们有没有发现,**构造方法这样的包装是不是很麻烦**,我们可以优化一下。
## 美观优化
我们可以在Result类中,加入静态方法,一看就懂![](https://img-blog.csdnimg.cn/img_convert/56d7183909ec6c8a3d98de2587aca88b.png)那我们来改造一下Controller![](https://img-blog.csdnimg.cn/img_convert/097009fc1bfb15f11d8081207c76b061.png)代码是不是比较简洁了,也美观了。
## 优雅优化
上面我们看到在**Result类中增加了静态方法**,使得业务处理**代码简洁**了。但小伙伴们有没有发现这样有**几个问题:**
>1、每个方法的返回都是Result封装对象,没有业务含义
>2、在业务代码中,成功的时候我们调用Result.success,异常错误调用Result.failure。是不是很多余
>3、上面的代码,判断id是否为null,其实我们可以使用hibernate validate做校验,没有必要在方法体中做判断。我们最好的方式直接返回真实业务对象,最好不要改变之前的业务方式,如下图
![](https://img-blog.csdnimg.cn/img_convert/f223900327455fa3ce51b58edf877635.png)这个和我们平时的代码是一样的,非常直观,直接返回order对象,这样是不是很完美。**那实现方案是什么呢?**
## 实现方案
小伙伴们怎么去实现是不是有点思路,在这个过程中,我们需要做几个事情
>1、定义一个注解@ResponseResult,表示这个接口返回的值需要包装一下
>2、拦截请求,判断此请求是否需要被@ResponseResult注解
>3、核心步骤就是实现接口ResponseBodyAdvice和@ControllerAdvice,判断是否需要包装返回值,如果需要,就把Controller接口的返回值进行重写。
### 注解类
用来标记方法的返回值,是否需要包装
![](https://img-blog.csdnimg.cn/img_convert/d0c25da9a370f6cdfae6527d792399aa.png)### 拦截器
拦截请求,是否此请求返回的值需要包装,其实就是运行的时候,解析@ResponseResult注解
![](https://img-blog.csdnimg.cn/img_convert/14dd698feeae996d403c8b374a5933c4.png)此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。
### 重写返回体
![](https://img-blog.csdnimg.cn/img_convert/ba0ad862bc6b5e66b2888e652442ea1d.png)上面的代码就是**判断是否需要返回值包装**,如果**需要就直接包装**。这里我们只处理了正常成功的包装,**如果方法体报异常的怎么办**?处理异常也比较简单,只要判断body是否为异常类。
![](https://img-blog.csdnimg.cn/img_convert/cda617d07e5f03cc0b79a5edfc796266.png)怎么做全局的异常处理,篇幅原因,老顾这里就不做介绍了,只要思路理清楚了,自行改造就行。
### 重新Controller
![](https://img-blog.csdnimg.cn/img_convert/eab04f1734238aa8c3fc1ee605e5482e.png)在控制器类上或者方法体上**加上@ResponseResult注解**,这样就ok了,简单吧。到此返回的设计思路完成,是不是又简洁,又优雅。
## 总结
这个方案**还有没有别的优化空间**,当然是有的。如:**每次请求都要反射一下,获取请求的方法是否需要包装,其实可以做个缓存,不需要每次都需要解析**。当然整体思路了解,小伙伴们就可以在此基础上面自行扩展。谢谢!!!
# **读者福利(学习分享)**对于很多初级Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。**同时我经过多年的收藏目前也算收集到了一套完整的学习资料以及高清详细的Java架构进阶学习导图及笔记免费分享给大家,希望对想成为架构师的朋友有一定的参考和帮助。****资料免费领取方式:转发后,关注公众号:享学课堂online,后台回复关键词【java】可免费领取!**
![](https://img-blog.csdnimg.cn/img_convert/80970d7b337fa9ad324c9fffd17425bc.png)![](https://img-blog.csdnimg.cn/img_convert/6466448121e64c4b33b74e4b7df5004e.png)# 最后更多Java进阶学习资料、2021大厂面试真题、视频资料可以**[点击这里获取到免费下载方式!](https://gitee.com/vip204888/java-p7)**学习视频:![](https://img-blog.csdnimg.cn/img_convert/999c8f14cc9ec8c050be272d6b5e5b29.png)大厂面试真题:ee.com/vip204888/java-p7)**学习视频:[外链图片转存中...(img-2SPPidYV-1628435800685)]大厂面试真题:![](https://img-blog.csdnimg.cn/img_convert/d055acbe7d27cdd2721c4a7019fd8180.png)
分布式之API接口返回格式如何优雅设计?,苦熬一个月相关推荐
- Spring Boot 中如何统一 API 接口响应格式?
今天又要给大家介绍一个 Spring Boot 中的组件–HandlerMethodReturnValueHandler. 在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?) ...
- 使用 JsonSchema 验证 API 的返回格式
使用 JsonSchema 验证 API 的返回格式 Intro 最近我们的 API 提供给了别的团队的小伙伴用,按照他们的需求做了接口的改动,API 返回的数据结构有一些变化,我们提供的接口有缓存, ...
- SpringBoot 系列教程(八十五):Spring Boot使用MD5加盐验签Api接口之前后端分离架构设计
加密算法参考: 浅谈常见的七种加密算法及实现 加密算法参考: 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 目的: 通过对API接口请求报文签名,后端进行验签处理, ...
- 开源项目 ——API接口管理平台数据库原型设计(三)
开源项目 --API接口管理平台数据库原型设计(三) 背景 日常我们开发人员在开发一些常用的平台时都会用到各种各样的接口,而对于这些接口的有效管理都会成为我们的一些麻烦事,一些常见的接口管理平台我们使 ...
- java api接口怎么写_Java 如何设计 API 接口,实现统一格式返回?
来源:老顾聊技术 前言 接口交互 返回格式 控制层Controller 美观美化 优雅优化 实现方案 前言 在移动互联网,分布式.微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式, ...
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
一:背景 1. 讲故事 前段时间和一家公司联调api接口的时候,发现一个奇葩的问题,它的api返回的json会动态改变,简化如下: {"Code":101,"Items& ...
- Java API接口统一格式返回结果类
废话不多说,直接正文. 首先,我们需要定义规则(返回的格式).如http的返回状态码 404,500,200等.我们都知道404是找不到资源,200是正常的.由此可以知道,每一个状态码都有一个对应的说 ...
- API接口 返回值说明
介绍API:应用程序接口(API:Application Program Interface) 应用程序接口是一组定义.程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信.API 的一 ...
- 基于“新浪乐库”的音乐搜索API接口,返回JSON数据
新浪开发平台提供的API接口非常丰富,可没有音乐搜索的接口,对于我们这些搞基于微博应用的孩子还是比较悲剧的. 于是我可爱的好基友@ACMer_耕畅写了一段代码,把"新浪乐库"返回的 ...
最新文章
- DO YOU WANNA BUILD A SNOW MAN ?
- python课程设计报告总结-上海python课程设计报告目的
- ionic安装及入门示例
- 网页静态化和网页伪静态化之间的区别与选择
- 掌握这四点核心思想,统计学才算入门
- 递归算法的时间复杂度分析
- Highcharts+Spring饼图使用实例
- php 添加失败是什么原因,安装zblog提示“创建c_option.php失败”的原因和解决办法...
- 阿里大数据部门真实工作场景,和你想象的一样吗?
- 视频行为识别检测综述
- 离散数学学习笔记——第二讲——命题逻辑(第一部分)(2.1什么是命题)
- Tomcat访问localhost:8080直接跳转到项目首页
- android wear 兼容问题,多款Android Wear手表不兼容iPhone 7
- 计算机网络:随机访问介质访问控制之CSMA协议
- 【Chrome插件】广告屏蔽神器 Adblock Plus使用教程
- 微信支付宝H5收款码扫码转账个人通道仿原生接口带备注可回调成功率9成以上
- springboot 图片映射404问题
- mul matlab,[转载]Matlab boxplot for Mul
- [量化-027]段永平投资哲学整理
- 设计模式-结构模式-装饰器模式 decorater
热门文章
- 中国内鼻扩张器市场趋势报告、技术动态创新及市场预测
- 冷室压铸机行业调研报告 - 市场现状分析与发展前景预测
- 触摸工业光掩模行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 深度适配云环境,火山引擎推出云操作系统veLinux
- 5 张图带你了解 Pulsar 的存储引擎 BookKeeper
- 招程序员不要信中医的? | 从编程的角度看中医
- iOS 14.5 更新,苹果手表可以解锁 iPhone 了!
- 昇腾万里·让AI无所不及!DevRun开发者沙龙在武汉成功举办
- TIOBE 9 月编程语言:C++ 突起、Java 流行度下降
- iOS 开发面试通关指南:67 个必知问题!