一、为什么要将返回结果统一
项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数 据就可以。但是一般会包含状态码、返回消息、数据这几部分内容。 例如,我们的系统要求返回的基本数据格式如下:
列表:
分页:
没有返回数据:
失败:
因此,我们定义统一返回结果:
二、创建统一结果返回类
1、在common模块下创建子模块common-utils
2、创建接口定义返回码 (也可以使用枚举类型来定义)
public interface ResultCode { //成功状态码 public static Integer SUCCESS = 20000; //失败状态码 public static Integer ERROR = 20001; }
3、创建结果类
@Data public class R { @ApiModelProperty(value = "是否成功") private Boolean success; @ApiModelProperty(value = "返回码") private Integer code; @ApiModelProperty(value = "返回消息") private String message; @ApiModelProperty(value = "返回数据") private Map<String, Object> data = new HashMap<String, Object>(); //把构造方法私有,让别人不能再使用这个类(不能new,也不能用R.去调用,类中只有静态方法能起作用) private R(){} //成功静态方法 public static R ok() { R r = new R(); r.setSuccess(true); r.setCode(ResultCode.SUCCESS); r.setMessage("成功"); return r; } //失败静态方法 public static R error() { R r = new R(); r.setSuccess(false); r.setCode(ResultCode.ERROR); r.setMessage("失败"); return r; } public R success(Boolean success){ this.setSuccess(success); return this; //this代表R的对象,谁调用就是谁 最终实现链式编程 } public R message(String message){ this.setMessage(message); return this; } public R code(Integer code){ this.setCode(code); return this; } public R data(String key, Object value){ this.data.put(key, value); return this; } public R data(Map<String, Object> map){ this.setData(map); return this; } }
三、使用统一返回结果
我们将已经写好的查询所有讲师和逻辑删除讲师的功能改变一下,让他们返回统一结果
//查询所有教师 @ApiOperation(value = "所有讲师列表") @GetMapping("/findAll") public R findAllTeacher(){ List<EduTeacher> list = eduTeacherService.list(null); //链式调用 return R.ok().data("items", list); } //逻辑删除讲师 @ApiOperation(value = "根据ID删除讲师") @DeleteMapping("{id}") public R removeTeacher(@PathVariable("id") String id){ boolean flag = eduTeacherService.removeById(id); if (flag){ return R.ok(); } else { return R.error(); } }
启动项目,进入swagger页面,看看查询所有讲师给我们返回的信息
这样我们就实现了将返回结果统一。