分布式之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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值