如何优雅的定义统一响应对象

博客 动态
0 213
优雅殿下
优雅殿下 2022-02-14 07:55:18
悬赏:0 积分 收藏

如何优雅的定义统一响应对象

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这个方法可以确定接口是否已经出错,这个方法同时可以使用在微服务调用中

image-20220213232544346

?

再测试一个失败的例子

/**	 * 返回携带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了,

image-20220214071332603

posted @ 2022-02-14 07:27 码农Amg 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员