Yiner

Nov 08, 2021

后端封装接口返回

约定JSON格式

一般我们和前端约定json格式是这样的
  • code: 返回状态码
  • message: 返回信息的描述
  • data: 返回值
 

封装java bean

定义返回状态码枚举

💡
定义返回状态码,和信息一一对应,可以按数字分组并约定xxx~xxx 是什么类型的错误码,防止后期错误码重复,更加统一便于维护。
 

定义返回结果体

  • 返回结果中的code,和message都从定义的状态枚举中获取。
  • 最后结果返回泛型的原因:因为泛型效率要高于object,object需要强制类型转换,
  • 实现了Serializable接口的原因:web传输中,通过流bytes传输方式,速率更快。
 

定义返回结果方法

💡
一般业务返回要么是 success成功,要么就是failure失败,所以需要单独定义两个返回实体对象方法。
 
💡
注意这里定义的是静态方法,因为使用构造方法创建对象再调用太麻烦了, 我们使用静态方法就直接能类调用很方便。
 
 

调用返回结果

手动调用

💡
controller中调用返回结果方法,返回统一json格式。
 

统一包装

以上手动调用的代码不够完善,比如:
  1. 每次controller中所有的方法的返回必须都是要Result类型,我们想返回其他类型格式比较难处理;
  1. 不够语义化,其他开发人员看你方法根本就不知道具体返回了什么信息。
 
如果改成以下这个样子,其他开发人员一看就知道具体是返回什么数据,但是实际上发送给前端的数据应该是result格式封装的。
💡
可以通过SpringBoot提供的ResponseBodyAdvice进行统一响应处理。
 

1. 定义注解来识别

💡
该注解用于标识需要包装。
💡
自定义注解@ResponseResult来拦截在controller中有此注解的,代表需要统一返回json格式,没有此注解则按照原样返回。
 

2. 定义请求拦截器

💡
该拦截器用于过滤和设置拦截标志。
💡
定义请求拦截器,通过反射获取到有此注解的HandlerMethod,设置包装拦截标志。
 

3. 定义返回结果包装器

💡
该类是实际进行返回结果包装处理的类。
💡
实现ResponseBodyAdvice<Object> 接口,自定义json返回解析器,根据包装拦截标志判断是否需要自定义返回类型。
  • supports方法用于判断是否有包装标志,supports返回true才会在结果返回前调用下面的beforeBodyWrite方法。
  • 这里偷懒,失败的返回结果直接在Controller里面返回了ResultCode类型,所以用body instanceof ResultCode来判断是否是失败结果。
💡
注意这里string类型返回要单独json序列化返回一下,不然会报转换异常。
 

4. 使用

💡
在Controller中返回任意类型,不用每次都必须返回 Result 。(成功结果的情况)
 

Copyright © 2025 Yiner

logo