前言
现在我们做项目基本上中大型项目都是选择前后端分离,前后端分离已经成了一个趋势了,所以总这样·我们就要和前端约定统一的api 接口返回json 格式,
这样我们需要封装一个统一通用全局 模版api返回格式,下次再写项目时候直接拿来用就可以了
约定JSON格式
一般我们和前端约定json格式是这样的
1 | json复制代码{ |
- code: 返回状态码
- message: 返回信息的描述
- data: 返回值
封装java bean
定义状态枚举
1 | java复制代码package cn.soboys.core.ret; |
定义返回状态码,和信息一一对应,我们可以约定xxx~xxx 为什么错误码,防止后期错误码重复,使用混乱不清楚,
定义返回体结果体
1 | java复制代码package cn.soboys.core.ret; |
code,和message都从定义的状态枚举中获取
这里有两个需要注意地方我的数据类型
T data
返回的是泛型
类型而不是object
类型而且我的结果累实现了Serializable
接口
我看到网上有很多返回object,最后返回泛型因为泛型效率要高于object,object需要强制类型转换,还有最后实现了Serializable
接口因为通过流bytes传输方式web传输,速率更块
定义返回结果方法
一般业务返回要么是 success
成功,要么就是failure
失败,所以我们需要单独定义两个返回实体对象方法,
1 | java复制代码package cn.soboys.core.ret; |
注意这里我定义的是静态工具方法,因为使用构造方法进行创建对象调用太麻烦了, 我们使用静态方法来就直接类调用很方便
这样我们就可以在controller中很方便返回统一api格式了
1 | java复制代码 package cn.soboys.mallapi.controller; |
返回结果符合我们预期json格式
但是这个代码还可以优化,不够完善,比如,每次controller中所有的方法的返回必须都是要Result类型,我们想返回其他类型格式怎么半,还有就是不够语义化,其他开发人员看你方法根本就不知道具体返回什么信息
如果改成这个样子就完美了如
1 | java复制代码 @GetMapping("/list") |
其他开发人员一看就知道具体是返回什么数据。但这个格式要怎么去统一出来?
其实我们可以这么去优化,通过SpringBoot提供的ResponseBodyAdvice
进行统一响应处理
- 自定义注解@ResponseResult来拦截有此controller注解类的代表需要统一返回json格式,没有就安照原来返回
1 | java复制代码package cn.soboys.core.ret; |
- 定义请求拦截器通过反射获取到有此注解的HandlerMethod设置包装拦截标志
1 | java复制代码package cn.soboys.core.ret; |
- 实现
ResponseBodyAdvice<Object>
接口自定义json返回解析器根据包装拦截标志判断是否需要自定义返回类型返回类型
1 | java复制代码package cn.soboys.core.ret; |
注意这里string类型返回要单独json序列化返回一下,不然会报转换异常
这样我们就可以在controler中返回任意类型,了不用每次都必须返回 Result
如
1 | java复制代码package cn.soboys.mallapi.controller; |
这里还有一个问题?正常情况返回成功的话是统一json 格式,但是返回失败,或者异常了,怎么统一返回错误json 格式,sprinboot有自己的错误格式?
请参考我上一篇,SpringBoot优雅的全局异常处理
扫码关注公众号猿人生了解更多好文
本文转载自: 掘金