接口返回值response统一标准格式

Posted 97guoxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口返回值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在写入参数列表之前要做的操作

*/
    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.fail(errorResult.getStatus(),errorResult.getMessage());
  }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转换处理。

以上是关于接口返回值response统一标准格式的主要内容,如果未能解决你的问题,请参考以下文章

如何设计 API 接口,实现统一格式返回?

ajax请求接口怎么获得返回数据

react jsonp请求接口成功,但是接口返回的response为空

SpringBoot返回统一的JSON标准格式

SpringBoot返回统一的JSON标准格式

Jmeter--如何调用Response返回值