本篇介绍rest接口,如何返回统一的状态码、消息、数据等。
rest 返回结果封装
public class RestResult<T> {
private Integer code; //状态码
private String message; //文字消息
private T data; //返回数据
//省略get/
生成结果的静态方法
public class RestResultGenerator {
//生成结果的静态方法
public static <T> RestResult<T> genResult(Integer code, T data, String message) {
RestResult<T> result = new RestResult<T>();
result.setCode(code);
result.setMessage(message);
result.setData(data);
return result;
}
//以下是常用的一些方法,自动生成结果
public static <T> RestResult<T> success() {
return success(null);
}
public static <T> RestResult<T> success(T data) {
return genResult(0, data, null);//默认成功状态为0
}
public static <T> RestResult<T> error(String message) {
return error(1, message);//默认失败状态为1
}
public static <T> RestResult<T> error(Integer retCode, String message) {
return genResult(retCode, null, message);
}
在控制层,直接调用以上静态方法,就可以组装统一格式的返回结果。但这样代码就整合在一起了,以下方式可以实现控制层和统一格式处理的分离。
成功统一返回ResponseBodyAdvice
@RestControllerAdvice(basePackages = {"com.xxx","com.controller"})
public class RestResultAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
//可检查参数,做一些自定义处理
return true;//true表示执行beforeBodyWrite,false不执行
}
@Override
public RestResult<Object> beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
//可检查参数,做一些自定义处理
return RestResultGenerator.genResult(0,body,"success"); //统一成功返回
}
basePackages:对特定包下的类生效
supports方法:控制层返回后,就会进入这个方法。在这里可获取参数returnType和converterType,可根据此做一些自定义的判断,检查是否是我们支持的参数,支持返回true,不支持返回false。我这里不做特别检查,直接返回true。
beforeBodyWrite:以上返回true时,会调用这个方法。同样可以检查一些参数,最终返回一个统一封装的结果。
异常结果返回
以上是请求成功的结果封装。假如是失败呢,根据不同的失败类型,可以抛出不同的异常。通过全局异常捕获类,同样调用RestResultGenerator.genResult,返回不同的状态码和消息文本,参考第15篇