接⼝返回值response统⼀标准格式
⼀、为什么要对springboot的接⼝返回值统⼀标准格式
  springboot默认情况下的response格式:String、Object、void、异常,以上⼏种情况,如果和客户端开发⼈员联调接⼝,他们会很懵逼,因为你给他们的接⼝没有⼀个统⼀
的格式,客户端开发⼈员,不知道如何处理返回值,所以要统⼀response的标准格式。
⼆、定义response的标准格式
  ⼀般的response的标准格式包含三部分:1.status状态值:代表本次请求response的状态结果;2.response描述:代表本次请求response的状态结果;3.data数据:本次返回
的数据。
{
"status":0,
"desc":"成功",
"data":"test"
}
三、response代码封装
1.采⽤ResponseBodyAdvice技术来实现response的统⼀格式,ResponseBodyAdvice的作⽤:拦截Controller⽅法的返回值,统⼀处理返回值/响应体,⼀般⽤来做response的
统⼀格式、加解密、签名等等。ResponseBodyAdvice接⼝源码:
public interface ResponseBodyAdvice<T> {
boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);
/*主要有两个⽅法  boolean supports判断是否⽀持, beforeBodyWrite在写⼊参数列表之前要做的操作
*/
write的返回值T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response);
}
2.写⼀个ResponseBodyAdvice实现类
@ControllerAdvice
public class ResponseHandler implements ResponseBodyAdvice<String> {
/**
* 是否⽀持advice功能
*true=⽀持,false=不⽀持
*/
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Objcet beforeBodyWrite(Object o, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {  if(o instanceof ErrorResult){
    ErrorResult errorResult = (ErrorResult)o;
    return Result.Status(),Message());
  }else if (o instanceof String){
    return JsonUtil.object2json(Result.suc(o));
  }return Result.sec(o);
}
}
重点1.@ControllerAdvice注解:
  @ControllerAdvice这是⼀个⾮常有⽤的注解,它的作⽤是增强Controlle r的扩展功能类。主要体现在两⽅⾯:对Controller全局数据统⼀处理,对Controller全局异常统⼀处
理。
  在使⽤@ControllerAdvice时,还要特别注意,加上basePackages,@ControllerAdvice ( basePackages = "com. guo. boot"),因为如果不加的话,它可是对整个系统的
Controller做了扩展功能,它会对某些特殊功能产⽣冲突,例如不加的话,在使⽤swagger时会出现空⽩页异常。
重点2.beforeBodyWrite⽅法体的response类型判断
if (o instanceof String){
    return JsonUtil.object2json(Result.suc(o));
  }
以上代码⼀定要加,因为Controller的返回值为String的时候,它是直接返回String,⽽不是json。故要做下json转换处理。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。