记录Springboot--定义Rest风格接口统一返回的数据结构

技术分享 学习心得 2020-04-10 阅读:123

在前后端分离的开发中,开发后端返回的数据往往是在controller层中返回的,一般都是在controller写Restful风格的接口来返回数据。这时候返回的数据格式一般都是json格式,而且返回一般都有一个统一的数据结构形式 即:
{
“code”:…(请求接口返回的码)
“msg”:…(请求接口返回的信息)
“data”:…(一般返回数据,若是不返回就不显示)
}
所以在springboot中需要创建一个自定义的统一返回处理类,来处理全局的输出

先自定义一个统一的返回结果类

1.RetResult.java

@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RetResult<T> {
    private int code;
    private String msg;
    private T data;

    public RetResult(int code,String msg,T data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }


    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

创建一个常用的code 枚举类型

2.RetCode

public enum RetCode {
    // 成功
    SUCCESS(200),

    // 失败
    FAIL(202),

    // 未认证(签名错误)
    UNAUTHORIZED(401),

    // 接口不存在
    NOT_FOUND(404),

    // 服务器内部错误
    INTERNAL_SERVER_ERROR(500);

    public int code;

    RetCode(int code) {
        this.code = code;
    }
}

自定义一些code,msg,data返回

3.RetResponse.java

public class RetResponse {
    //自定义message 失败信息
    public static <T> RetResult<T> makeErrRsp(String message) {
        return new RetResult<T>(202,message,null);
    }

    //自定义code,msg 返回数据
    public static <T> RetResult<T> makeRsp(int code, String msg) {
        return new RetResult<T>(code,msg,null);
    }
    //自定义code,msg,data 返回数据
    public static <T> RetResult<T> makeRsp(int code, String msg, T data) {
        return new RetResult<T>(code,msg,data);
    }
}

最后创建一个对全局返回输出的结果类的处理类

4.RetResultAdvice.java

@RestControllerAdvice
public class RetResultAdvice implements ResponseBodyAdvice<Object> {

    //需要忽略拦截的类
    
    //这个方法表示对于哪些请求要执行beforeBodyWrite,返回true执行,返回false不执行
    @Override   
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        //如果是返回了RetResult类就直接返回不做处理
        if (o instanceof RetResult) {
            return o;
        }
        //如果返回的数据是string类型的时候做的处理    
        if(o instanceof String) {
            return JSON.toJSONString(o);
        }
        return new RetResult(200,"success" , o);
    }
}

controller层创建TestController.java测试
这里返回自己定义的用户测试数据

@GetMapping("/list")
public List<Blog> findAll(){
    return bookService.findAll();
}

2020-04-10_215927.jpg

模拟测试没有返回数据,只执行一些业务

@RequestMapping("/test")
@ResponseBody
public void test(){
    Random random=new Random();
    int i=random.nextInt(10);
    return;
}

2020-04-10_220046.jpg

测试返回自定义的code,msg:

@RequestMapping("/test")
@ResponseBody
public RetResult test(){
    Random random=new Random();
    int i=random.nextInt(10);
    return RetResponse.makeRsp(208,"自定义msg");
}

2020-04-10_220126.jpg

版权声明

本文基于《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
文章链接:https://www.hiai.top/archives/374.html (转载时请注明本文出处及文章链接)

如果觉得我的文章对你有用,请随意赞赏

0条评论