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了,