springboot接口返回统一格式

一个response的标准格式

status状态码

response描述,对本次状态码的描述

data数据,本次返回的数据

{"status":0,"desc":"成功","data":"test"}

 

初级程序员对response代码封装

对response的统一封装,是有一定的技术含量的

1把标准格式转化为代码

2把状态码存在枚举类里面

3加一个体验类

 

把返回的数据转化为自己编写的代码

 

结论,这样写代码有什么问题,看到这里,应该有很多同学都知道这样封装代码有很大弊端,因为你每写一个接口,都要手工指定Result.sut()这行代码,多累啊

如果你写这种代码推广给你整个公司用,然后强硬规定代码必须这么写,所有公司员工都会吐槽你鄙视你

更可怕的是,互联网很多教程都是这么写的

互联网上的很多java教程包括文章都是垃圾中的垃圾

这么写是要被人骂的,高级程序员是不需要Result.sut()这行代码的

 

不需要每个接口都手工指定Result返回值

采用ResponseBodyAdvice技术来实现response的统一格式

ResponseBodyAdvice类,拦截Controller方法的返回值,统一处理返回值/响应体,一般来做response的统一格式,加密,签名等

 

步骤2:写一个这个接口的实现类

 

@ControllerAdvice(basePackages="com.example")

增加Controller的扩展功能类

体现在两个方面,对Controller全局数据统一处理,例如这节课就是对response统一封装。对全局异常的统一处理

 

com.exampe

config

service

controller

 

如果不加根包的话,可能会对整个系统的Controller做出了扩展

 

统一返回数据接口

response包

package com.example.demo.response;

public enum ResultCode {
    SUCCESS(0,"成功"),

    SYSTEM_ERROR(10000,"系统异常,请稍后重试"),
    UNTHORIZED(10401,"签名验证失败"),

    PARAM_IS_INVALID(10001,"参数无效"),

    USER_HAS_EXISTED(20001,"用户名已存在"),
    USER_NOT_FOUND(20002,"用户名不存在");
    private Integer code;
    private String message;
    ResultCode(Integer code,String message){
        this.code = code;
        this.message = message;
    }
    public Integer code(){
        return code;
    }
    public String message(){
        return message;
    }
}
package com.example.demo.response;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result {
    private Integer status;
    private String desc;
    private T data;
    public static Result suc(){
        Result result = new Result();
        result.setResultCode(ResultCode.SUCCESS);
        return result;
    }
    public static Result suc(Object data){
        Result result = new Result();
        result.setResultCode(ResultCode.SUCCESS);
        result.setData(data);
        return result;
    }
    public static Result fail(Integer status,String desc){
        Result result = new Result();
        result.setStatus(status);
        result.setDesc(desc);
        return result;
    }
    public static Result fail(ResultCode resultCode){
        Result result = new Result();
        result.setResultCode(resultCode);
        return result;
    }
    private void setResultCode(ResultCode resultCode){
        this.status = resultCode.code();
        this.desc = resultCode.message();
    }
}

在返回数据的时候

使用Result.suc("hello world")即可

 

advice包

@ControllerAdvice(basePackages = "com.example.demo")

public class ResponseHandler implements ResponseBodyAdvice {

@Override

public boolean supports(MethodParameter methodParameter, Class> aClass) {

return true;

}

 

@Override

public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {

}

}

 

这样返回数据的时候,就会做统一处理

 

@AllArgsConstructor和@NoArgsConstructor和@Data注解一定要加,枚举里如果有两个变量,那么就可以

RED(100,"红色"),BLUE(101,"蓝色");

也要有构造函数,给成员变量赋参数值

你可能感兴趣的:(java)