统一结果返回
目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。
统一结果的一般形式
-
是否响应成功;
-
响应状态码;
-
状态码描述;
-
响应数据
-
其他标识符
结果类枚举
前三者可定义结果枚举,如:success,code,message
1 @Getter 2 public enum ResultCodeEnum { 3 SUCCESS(true,20000,"成功"), 4 UNKNOWN_ERROR(false,20001,"未知错误"),, 5 PARAM_ERROR(false,20002,"参数错误"), 6 ; 7 8 // 响应是否成功 9 private Boolean success; 10 // 响应状态码 11 private Integer code; 12 // 响应信息 13 private String message; 14 15 ResultCodeEnum(boolean success, Integer code, String message) { 16 this.success = success; 17 this.code = code; 18 this.message = message; 19 } 20 }
统一结果类
1 /** 2 * @author Hugo 3 * @time 2020/4/20 4 */ 5 6 public class R { 7 private Boolean success; 8 9 private Integer code; 10 11 private String message; 12 13 private Map <String,Object> data = new HashMap<String,Object>(); 14 15 /** 16 * 私有化构造器 17 */ 18 private R(){ 19 20 } 21 22 /** 23 * 通用返回失败,未知错误 24 * @return 25 */ 26 public static R error(){ 27 R r = new R(); 28 r.setSuccess(ResultCodeEnu.UNKNOWN_ERROR.getSuccess()); 29 r.setCode(ResultCodeEnu.UNKNOWN_ERROR.getCode()); 30 r.setMessage(ResultCodeEnu.UNKNOWN_ERROR.getMessage()); 31 return r; 32 } 33 34 /** 35 * 通用返回成功 36 * @return 37 */ 38 public static R ok(){ 39 R r =new R(); 40 r.setSuccess(ResultCodeEnu.SUCCESS.getSuccess()); 41 r.setCode(ResultCodeEnu.SUCCESS.getCode()); 42 r.setMessage(ResultCodeEnu.SUCCESS.getMessage()); 43 return r; 44 } 45 46 /** 47 * 设置结果,形参为结果枚举类 48 * @param result 49 * @return 50 */ 51 public static R setResult(ResultCodeEnu result){ 52 R r =new R(); 53 r.setSuccess(result.getSuccess()); 54 r.setMessage(result.getMessage()); 55 r.setCode(result.getCode()); 56 return r; 57 } 58 59 /** 使用链式编程,返回类本身**/ 60 // 自定义返回数据 61 public R data(Map<String,Object> map){ 62 this.setData(map); 63 return this; 64 } 65 66 /** 67 * 通用设置data 68 * @param key 69 * @param value 70 * @return 71 */ 72 public R data(String key, Object value){ 73 this.data.put(key, value); 74 return this; 75 } 76 77 /** 78 * 自定义状态信息 79 * @param message 80 * @return 81 */ 82 public R message(String message){ 83 this.setMessage(message); 84 return this; 85 } 86 87 /** 88 * 自定义状态码 89 * @param code 90 * @return 91 */ 92 public R code(Integer code){ 93 this.setCode(code); 94 return this; 95 } 96 97 /** 98 * 自定义返回结果 99 * @param success 100 * @return 101 */ 102 public R success(Boolean success){ 103 this.setSuccess(success); 104 return this; 105 } 106 107 public void setSuccess (Boolean success) { 108 this.success = success; 109 } 110 111 public void setCode (Integer code) { 112 this.code = code; 113 } 114 115 public void setMessage (String message) { 116 this.message = message; 117 } 118 119 public void setData (Map <String, Object> data) { 120 this.data = data; 121 } 122 123 public Boolean getSuccess () { 124 return success; 125 } 126 127 public Integer getCode () { 128 return code; 129 } 130 131 public String getMessage () { 132 return message; 133 } 134 135 public Map <String, Object> getData () { 136 return data; 137 } 138 }
小小体验一手-----------
控制层返回
视图层使用统一结果
使用SpringBoot小小模拟一下
1 ** 2 * @author Hugo 3 * @time 2020/4/20 4 */ 5 @RestController 6 @RequestMapping("/api/users") 7 public class TeacherAdminController { 8 9 10 11 @GetMapping("list") 12 public R list(){ 13 Model model =new Model(); 14 model.setId("1"); 15 model.setRole("vip1"); 16 List <Model> list = new ArrayList <>(); 17 list.add(model); 18 return R.ok().data("item",list); 19 }
20 }
最终返回结果
其他没有设置的属性默认为null