我们都知道在进行前后端分离项目开发时,后端服务器不再负责页面的跳转,而是返回给前台一个封装了结果集的json串,前台接收到后台返回的信息后负责页面的转发跳转以及页面的数据渲染。
一、为什么结果集要统一封装
我们都知道,在开发前后端分离项目的时候,前后台交互的流程大概是前台页面访问后台接口,后台处理完前台的请求后将处理结果返回给前台,由前台去进行页面的渲染。那么,后台返回给前台的结果信息肯定是由后台提前设置好的结果信息,就拿下面这段封装结果集的信息来看,每次返回结果信息都需要 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);
}
二、如何封装结果集
1.定义一个用于封装返回结果集的对象;
public class Result<T> {
/**
* 状态码
*/
public int code;
/**
* 提示信息
*/
private String msg;
/**
* 返回的数据
*/
private T data;
public Result<T> setCode(RetCode retCode) {
this.code = retCode.code;
return this;
}
public int getCode() {
return code;
}
public Result<T> setCode(int code) {
this.code = code;
return this;
}
public String getMsg() {
return msg;
}
public Result<T> setMsg(String msg) {
this.msg = msg;
return this;
}
public T getData() {
return data;
}
public Result<T> setData(T data) {
this.data = data;
return this;
}
}
2.定义一个状态码枚举,用以状态码的返回;
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;
}
}
3.把方法封装成一个工具类,避免频繁的new对象。
public class ResponseUtils {
private final static String SUCCESS = "操作成功";
private final static String FAIL = "操作失败";
public static <T> Result<T> makeSuccessResponse() {
return new Result<T>().setCode(RetCode.SUCCESS).setMsg(SUCCESS);
}
public static <T> Result<T> makeSuccessResponse(T data) {
return new Result<T>().setCode(RetCode.SUCCESS).setMsg(SUCCESS).setData(data);
}
public static <T> Result<T> makeSuccessResponse(String msg, T data) {
return new Result<T>().setCode(RetCode.SUCCESS).setMsg(msg).setData(data);
}
public static <T> Result<T> makeErrorResponse() {
return new Result<T>().setCode(RetCode.FAIL).setMsg(FAIL);
}
public static <T> Result<T> makeErrorResponse(String msg) {
return new Result<T>().setCode(RetCode.FAIL).setMsg(msg);
}
public static <T> Result<T> makeErrorResponse(int code, String msg) {
return new Result<T>().setCode(code).setMsg(msg);
}
public static <T> Result<T> makeResponse(int code, String msg) {
return new Result<T>().setCode(code).setMsg(msg);
}
public static <T> Result<T> makeResponse(int code, String msg, T data) {
return new Result<T>().setCode(code).setMsg(msg).setData(data);
}
}
三、返回的结果集
{
"code": 200,
"data":
{
"id": 1,
"username": "admin",
"password": "2f6495613c5217c6c5f46439fc57cff2",
"realname": "管理员"
},
"msg": "登录成功"
}
返回结果集封装成一个对象无疑是一个好的习惯,它既可以减少频繁的new一个结果集对象损耗系统开销,又可以使程序变得美观整洁,何乐而不为呢?