接口返回值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统一标准格式的主要内容,如果未能解决你的问题,请参考以下文章