一、為什么要對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轉換處理。