好处:
后端统一返回格式,前端可以:
1.根据错误码做合适的展示,避免盲目等待、重复请求、无奈刷新。
2.根据页面当前的分页方式,对数据做相应处理。
后台:
后端主要使用类:R ResultCode:
首先是R,针对这个类我的考虑是其他类引用时会更加的方便,那么做泛型设计,静态的build都是个不错的选择。ResultCode 这个类的设计是将状态码和状态信息进行绑定,那么可以增加复用性。当需要新的message时,只要在ResultcodeEnum 新增一个枚举类型。看完这个类之后再下面讲讲枚举类的设计。
1.定义统一规范的枚举类:
package com.enation.app.javashop.core.video;
/**
* @desc 请求状态枚举
* 后续状态若太多,可以考虑使用继承等方式拓展。
* @slice zhaozhe 2020-8-16 16:48:44
*/
public enum ResultCode {
/**
* 广义通用
*/
SUCCESS(1, "成功"),
ERROR(-1, "错误"),
NOT_FOUND(-404, "没有找到资源"),
NOT_EMPTY(-400, "字段不能为空"),
DUPLICATE_EXCEPTION(-200, "重复异常"),
/**
* 规约:时间异常类 value定义区间为 -100 ~ -199
*/
TIME_EMPTY(-100, "时间不能为空"),
TIME_MORE_THAN_14_DAYS(-101, "时间跨度不能超过两个星期"),
/**
* 规约:字段为空 value区间 -200 ~ -299
*/
OPENID_EMPTY(-201, "openid不能为空");
private int value;
private String msg;
ResultCode(int value, String msg) {
this.value = value;
this.msg = msg;
}
public int getValue() {
return value;
}
public String getMsg() {
return msg;
}
}
2.对Controller的结果输出
package com.enation.app.javashop.core.video;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
* @desc 后端返回统一的结果集,例如包括状态码等信息,可以让前端更好的进行页面的展示。
* 封装这样一个结果集有通用且常用的几个属性:
* code: 状态码
* message:状态信息
* data:返回数据
* 后端统一返回格式,前端可以:根据错误码做合适的展示,避免盲目等待、重复请求、无奈刷新。
* 根据页面当前的分页方式,对数据做相应处理。
* @param <T>
* @since zhaozhe 2020-8-16 16:42:32
* @explain 后端主要使用类:R ResultCode
* 首先是R,针对这个类我的考虑是其他类引用时会更加的方便,那么做泛型设计,静态的build都是个不错的选择。ResultCode 这个类的设计是将状态码和状态信息进行绑定,那么可以增加复用性。当需要新的message时,只要在ResultcodeEnum 新增一个枚举类型。看完这个类之后再下面讲讲枚举类的设计。
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class R<T> {
private Integer code;
private String message;
/**
* data的总条数,在没有确定data类型时初始化为0显然不太合理。
*/
private Integer total;
private T data;
public static <T> R<T> build(Integer code, String message, Integer total, T data) {
return new R<>(code, message, total, data);
}
public static <T> R<T> build(ResultCode resultCode, String message, Integer total, T data) {
return new R<>(resultCode, message, total, data);
}
public static <T> R<T> error(ResultCode resultCode) {
return new R<>(resultCode);
}
public static <T> R<T> error(ResultCode resultCode, String message) {
return new R<>(resultCode, message);
}
public static <T> R<T> success() {
return new R<>(ResultCode.SUCCESS);
}
public static <T> R<T> client(T data) {
return new R<>(data);
}
public static <T> R<T> server(Integer total, T data) {
return new R<>(total, data);
}
/**
* 有错误的情况下需要传递错误码 + 错误提示
*
* @param code
* @param message
*/
private R(Integer code, String message) {
this.code = code;
this.message = message;
}
private R(ResultCode resultCode, String message) {
this.code = resultCode.getValue();
this.message = message;
}
private R(ResultCode resultCode) {
this.code = resultCode.getValue();
this.message = resultCode.getMsg();
}
/**
* 客户端分页,只需要数据 data
*
* @param data
*/
private R(T data) {
this.code = ResultCode.SUCCESS.getValue();
this.message = ResultCode.SUCCESS.getMsg();
this.data = data;
}
/**
* 服务端分页,data + total
*
* @param total
* @param data
*/
private R(Integer total, T data) {
this.code = ResultCode.SUCCESS.getValue();
this.message = ResultCode.SUCCESS.getMsg();;
this.total = total;
this.data = data;
}
private R(Integer code, String message, Integer total, T data) {
this.code = code;
this.message = message;
this.total = total;
this.data = data;
}
private R(ResultCode resultCode, String message, Integer total, T data) {
this.code = resultCode.getValue();
this.message = message;
this.total = total;
this.data = data;
}
private R() {}
}
3.试用结果
@ApiOperation(value = "添加视频流类型设置", response = VideoSetDO.class)
@PostMapping("/category/add")
public R add(@Valid @RequestBody VideoCategoryVO category) {
// @Valid 是hibernate验证,详情请百度
try {
VideoCategoryDO videoCategoryDO = new VideoCategoryDO();
BeanUtil.copyProperties(category, videoCategoryDO);
this.videoSetManager.editCategory(videoCategoryDO, id);
return R.client(category);
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
return R.error(ResultCode.ERROR, e.getMessage());
}
}
返回结果
本文总结于网上博客 。。。