统一结果返回
目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。
统一结果的一般形式
-
是否响应成功;
-
响应状态码;
-
状态码描述;
-
响应数据
-
其他标识符
结果类枚举
前三者可定义结果枚举,如:success,code,message:
@Getter public enum ResultCodeEnum { SUCCESS(true,20000,"成功"), UNKNOWN_ERROR(false,20001,"未知错误"), PARAM_ERROR(false,20002,"参数错误"); // 响应是否成功 private Boolean success; // 响应状态码 private Integer code; // 响应信息 private String message; ResultCodeEnum(boolean success, Integer code, String message) { this.success = success; this.code = code; this.message = message; } }
统一结果类
第5个属于自定义返回,利用前4者可定义统一返回对象
注意:
-
外界只可以调用统一返回类的方法,不可以直接创建,因此构造器私有;
-
内置静态方法,返回对象;
-
为便于自定义统一结果的信息,建议使用链式编程,将返回对象设类本身,即return this;
-
响应数据由于为json格式,可定义为JsonObject或Map形式;
@Data public class R { private Boolean success; private Integer code; private String message; private Map<String, Object> data = new HashMap<>(); // 构造器私有 private R(){} // 通用返回成功 public static R ok() { R r = new R(); r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess()); r.setCode(ResultCodeEnum.SUCCESS.getCode()); r.setMessage(ResultCodeEnum.SUCCESS.getMessage()); return r; } // 通用返回失败,未知错误 public static R error() { R r = new R(); r.setSuccess(ResultCodeEnum.UNKNOWN_ERROR.getSuccess()); r.setCode(ResultCodeEnum.UNKNOWN_ERROR.getCode()); r.setMessage(ResultCodeEnum.UNKNOWN_ERROR.getMessage()); return r; } // 设置结果,形参为结果枚举 public static R setResult(ResultCodeEnum result) { R r = new R(); r.setSuccess(result.getSuccess()); r.setCode(result.getCode()); r.setMessage(result.getMessage()); return r; } /**------------使用链式编程,返回类本身-----------**/ // 自定义返回数据 public R data(Map<String,Object> map) { this.setData(map); return this; } // 通用设置data public R data(String key,Object value) { this.data.put(key, value); return this; } // 自定义状态信息 public R message(String message) { this.setMessage(message); return this; } // 自定义状态码 public R code(Integer code) { this.setCode(code); return this; } // 自定义返回结果 public R success(Boolean success) { this.setSuccess(success); return this; } }
控制层返回
视图层使用统一结果:
@RestController @RequestMapping("/api/v1/users") public class TeacherAdminController { @Autowired private UserService userService; @GetMapping public R list() { List<Teacher> list = teacherService.list(null); return R.ok().data("itms", list).message("用户列表"); } }
json结果
{ "success": true, "code": 20000, "message": "查询用户列表", "data": { "itms": [ { "id": "1", "username": "admin", "role": "ADMIN", "deleted": false, "gmtCreate": "2019-12-26T15:32:29", "gmtModified": "2019-12-26T15:41:40" },{ "id": "2", "username": "zhangsan", "role": "USER", "deleted": false, "gmtCreate": "2019-12-26T15:32:29", "gmtModified": "2019-12-26T15:41:40" } ] } }