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

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  阅读(676)  评论(2编辑  收藏  举报