1.作用
统一数据在前后端通信的规范,帮助前端开发者更好地组织和管理前端数据,提高代码质量和开发效率。
数据模型:将从服务器端获取的数据映射为前端的数据模型,便于在前端进行处理和展示。
状态管理:通过定义不同的结果返回类来管理不同的状态,例如成功、失败、加载中等状态,从而更好地控制前端应用的状态流转。
错误处理:将错误信息封装在结果返回类中,便于统一处理和展示错误信息,提高用户体验。
2.使用泛型定义结果类
@Data
public class R<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
属性和方法:
code
:表示操作结果的编码,1 表示成功,0 或其他数字表示失败。msg
:表示错误信息。data
:表示返回的数据。map
:表示动态数据,使用HashMap
实现。
方法包括:
success
:静态方法,表示操作成功,返回一个R
对象,设置code
为 1,并将数据存入data
属性。error
:静态方法,表示操作失败,返回一个R
对象,设置code
为 0,并将错误信息存入msg
属性。add
:向map
中添加动态数据,返回当前对象。
使用
一个简单的api,不需要返回什么数据
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
//清除session
request.getSession().removeAttribute("employee");
return R.success("退出成功");
}
简单的泛型实现
@Data
public class ResultVo<T> {
private Integer code;
private T data;
}
通过生成实例使用,将对象返回给前端。
3. 使用object
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class JsonResult {
/**
* 响应状态码(业务状态码)
*/
private Integer code;
/**
* 状态码的含义(比如: 用户名被占用)
*/
private String msg;
/**
* 服务器端返回给客户端的具体数据(可能是VO对象,或者List集合)
*/
private Object data;
/**
* 构造器1: 适用于不需要返回具体数据的Controller方法
*/
public JsonResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 构造器2: 适用于不需要返回具体数据的Controller方法,使用了自定义枚举
*/
public JsonResult(StatusCode statusCode) {
this.code = statusCode.getCode();
this.msg = statusCode.getMsg();
}
/**
* 构造器3: 适用于需要返回具体数据的Controller方法,使用了自定义枚举
*/
public JsonResult(StatusCode statusCode, Object data) {
this.code = statusCode.getCode();
this.msg = statusCode.getMsg();
this.data = data;
}
/**
* 构造器4: 用于快速构建成功的返回结果
*/
public JsonResult(Object data) {
this.code = StatusCode.SUCCESS.getCode();
this.msg = StatusCode.SUCCESS.getMsg();
this.data = data;
}
public static JsonResult ok(Object data) {
return new JsonResult(data);
}
public static JsonResult ok() {
return ok(null);
}
}
/**
* 状态代码枚举类
*/
@Getter
@AllArgsConstructor
@NoArgsConstructor
public enum StatusCode {
/*枚举类型*/
SUCCESS(1, "OK"),
NOT_LOGIN(1000, "未登录"),
LOGIN_SUCCESS(1001, "登录成功"),
PASSWORD_ERROR(3, "密码错误"),
USERNAME_ERROR(2, "用户名错误"),
USERNAME_ALREADY_EXISTS(1004, "用户名已存在"),
FORBIDDEN_ERROR(1005, "无权访问"),
OPERATION_SUCCESS(2001, "操作成功"),
OPERATION_FAIL(2002, "操作失败"),
VALIDATE_ERROR(3002, "参数校验失败");
//属性要放在最下面
private Integer code;
private String msg;
}