Hope is being able to see there is light despite all of the darkness
目前主流开发方式都是前后端分离的,定义一种通用统一的返回格式,在前后端进行沟通时是非常有必要的,大家基于这个约定去理解,出现问题能够快速定位,接下来就介绍一下如何优雅定义统一响应对象
定义一个统一响应对象,这个对象需要完成的事情有
以下是我习惯使用的,仅供参考
//省略getter和setter等public class ApiResult<T> { /** * 状态标识 */ private Integer code; /** * 携带的信息 */ private String msg; /** * 携带数据体 */ private T data; /** * 是否出错 * @return true or false */ public boolean isError() { return code != HttpStatus.OK.value(); }}由于每次new对象返回,显得不是很优雅,所以我还会使用到一个辅助的生成类,专门用来快速简便的生成响应对象
public class ApiResultGenerator { private static final Integer OK = 200; private static final Integer SERVER_ERROR = 500; private static final Integer NOT_FOUND = 404; public static ApiResult success() { ApiResult result = new ApiResult(); result.setCode(OK); return result; } public static <T> ApiResult<T> success(T data) { ApiResult<T> result = new ApiResult<>(); result.setCode(OK); result.setData(data); return result; } public static ApiResult failure() { ApiResult result = new ApiResult(); result.setCode(SERVER_ERROR); result.setMsg("server error..."); return result; } public static ApiResult failure(String msg) { ApiResult result = new ApiResult(); result.setCode(SERVER_ERROR); result.setMsg(msg); return result; } public static <T> ApiResult<T> failure(String msg, T data) { ApiResult<T> result = new ApiResult(); result.setCode(SERVER_ERROR); result.setMsg(msg); result.setData(data); return result; } //...自由发挥}既然统一响应对象已经建立了,按照我们的习惯就是开始测试了
/** * 返回不携带data的(成功例子) * @return */ public ApiResult getPaperInfoSuccess() { if (log.isInfoEnabled()) { log.info("收到获取paper信息请求..."); } //...业务逻辑 if (log.isInfoEnabled()) { log.info("完成获取paper信息请求,准备返回对象信息"); } return ApiResultGenerator.success(); }可以注意,这个json对象就是我们跟前端交互的桥梁,通过isError这个方法可以确定接口是否已经出错,这个方法同时可以使用在微服务调用中

?
再测试一个失败的例子
/** * 返回携带data的(失败例子) * @return */@GetMapping("/getStrSF")public ApiResult<List<String>> getTestStrFailure() { if (log.isInfoEnabled()) { log.info("收到获取Str集合请求..."); } ApiResult<List<String>> response; try { response = getStrs(); //手动模拟一个异常 int i = 1/0; } catch (Exception e) { if (log.isErrorEnabled()) { log.error("获取Str集合出错"); } return ApiResultGenerator.failure("获取Str集合异常", null); } if (log.isInfoEnabled()) { log.info("完成获取Str集合请求,准备返回对象信息: {}", JSON.toJSONString(response)); } return response;}可以注意到,返回data是null,是因为在返回的时候直接赋值为null了,
