Bootstrap

前后端统一结果集封装

一、为什么结果集要统一封装

我们都知道,在开发前后端分离项目的时候,前后台交互的流程大概是前台页面访问后台接口,后台处理完前台的请求后将处理结果返回给前台,由前台去进行页面的渲染。那么,后台返回给前台的结果信息肯定是由后台提前设置好的结果信息,就拿下面这段封装结果集的信息来看,每次返回结果信息都需要 new 一个结果集对象,如果每次都new一个对象,会加大系统开销,损耗系统性能,为了一个返回结果而去这样加大系统开销实在是不值得推荐,那应该怎样呢?想必大家也都见过,那就是把返回结果集封装成一个工具类,每次就不需要频繁的new对象了,这样会一定程度上减少系统开销。

@GetMapping("login")
public void loginResult() {
    Result result = new Result();
    result.setCode(200);
    result.setMsg("登录成功");
    result.setData("user",user);
}

@GetMapping("logout")
public void logoutResult() {
    Result result = new Result();
    result.setCode(200);
    result.setMsg("注销成功");
    result.setData(null);
}

二、如何封装结果集

public class Result {
    /**
     * 状态码
     */
    public int code;
    /**
     * 提示信息
     */
    private String msg;
    /**
     * 返回的数据
     */
    private T data;
    
    public Result setCode(RetCode retCode) {
        this.code = retCode.code;
        return this;
    }
    public int getCode() {
        return code;
    }
    public Result setCode(int code) {
        this.code = code;
        return this;
    }
    public String getMsg() {
        return msg;
    }
    public Result setMsg(String msg) {
        this.msg = msg;
        return this;
    }
    public T getData() {
        return data;
    }
    public Result setData(T data) {
        this.data = data;
        return this;
    }
}

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

    //请求失败
    FAIL(400),

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

    //资源拒绝访问
    FORBIDDEN(403),

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

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

    public int code;

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

}

public class ResponseUtils {

    private final static String SUCCESS = "操作成功";
    private final static String FAIL = "操作失败";

    public static  Result makeSuccessResponse() {
        return new Result().setCode(RetCode.SUCCESS).setMsg(SUCCESS);
    }

    public static  Result makeSuccessResponse(T data) {
        return new Result().setCode(RetCode.SUCCESS).setMsg(SUCCESS).setData(data);
    }

    public static  Result makeSuccessResponse(String msg, T data) {
        return new Result().setCode(RetCode.SUCCESS).setMsg(msg).setData(data);
    }

    public static  Result makeErrorResponse() {
        return new Result().setCode(RetCode.FAIL).setMsg(FAIL);
    }

    public static  Result makeErrorResponse(String msg) {
        return new Result().setCode(RetCode.FAIL).setMsg(msg);
    }
    public static  Result makeErrorResponse(int code, String msg) {
        return new Result().setCode(code).setMsg(msg);
    }

    public static  Result makeResponse(int code, String msg) {
        return new Result().setCode(code).setMsg(msg);
    }

    public static  Result makeResponse(int code, String msg, T data) {
        return new Result().setCode(code).setMsg(msg).setData(data);
    }
}

三、封装后的结果集长啥样

{
  "code": 200,
  "data":
  {
    "id": 1,
    "username": "admin",
    "password": "2f6495613c5217c6c5f46439fc57cff2",
    "realname": "管理员"
  },
  "msg": "登录成功"
}