接口返回值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轉換處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM