说明:
(1)在【Spring Boot电商项目14:用户模块三:API统一返回对象;(其中,涉及了【使用枚举类,来管理接口请求失败时,将要向前端返回的(状态码)和(错误信息)】;)】中,我们定义了API统一返回对象;;;本篇博客的内容,基本也是一样的;
(2)然后,本篇博客中的内容,个人感觉没有【Spring Boot电商项目14:用户模块三:API统一返回对象;】中的优雅;
目录
二:完美版:ResponseStatusEnum枚举类,GraceJSONResult类;
一:初始版:IMOOCJSONResult类;
IMOOCJSONResult类:
package com.imooc.grace.result; /** * * @Title: IMOOCJSONResult.java * @Package com.imooc.utils * @Description: 自定义响应数据结构 * 本类可提供给 H5/ios/安卓/公众号/小程序 使用 * 前端接受此类数据(json object)后,可自行根据业务去实现相关功能 * * * 响应业务状态码: * 200:表示成功 * 500:表示错误,错误信息在msg字段中 * 501:bean验证错误,不管多少个错误都以map形式返回 * 502:拦截器拦截到用户token出错 * 555:异常抛出信息 * 556: 用户qq校验异常 * 557: 校验用户是否在CAS登录,用户门票的校验 * @Copyright: Copyright (c) 2020 * @Company: www.imooc.com * @author 慕课网 - 风间影月 * @version V1.0 */ public class IMOOCJSONResult { // 响应业务状态 private Integer status; // 响应消息 private String msg; // 响应中的数据 private Object data;//具体返回的数据 private String ok; // 不使用 /** * 通过传入【status,msg,data】得到IMOOCJSONResult对象; */ public static IMOOCJSONResult build(Integer status, String msg, Object data) { return new IMOOCJSONResult(status, msg, data);//去调用后面编写的三参构造; } /** * 通过传入【status,msg,data,OK】得到IMOOCJSONResult对象; */ public static IMOOCJSONResult build(Integer status, String msg, Object data, String ok) { return new IMOOCJSONResult(status, msg, data, ok);//去调用后面编写的四参构造; } /** * 通过传入【data】得到IMOOCJSONResult对象:200,OK,data; */ public static IMOOCJSONResult ok(Object data) { return new IMOOCJSONResult(data);//去调用后面编写的一参构造; } /** *没有任何参数,得到默认成功时的IMOOCJSONResult对象;200,OK,null; */ public static IMOOCJSONResult ok() { return new IMOOCJSONResult(null);//去调用后面编写的无参构造; } /** * 业务产生500错误时,可以通过这个方法,得到对应的IMOOCJSONResult对象:500,msg,null; */ public static IMOOCJSONResult errorMsg(String msg) { return new IMOOCJSONResult(500, msg, null);//去调用后面编写的三参构造; } /** * 业务产生557“校验用户是否在CAS登录,用户门票的校验”发生错误时, * 可以通过这个方法,得到对应的IMOOCJSONResult对象:557,msg,null; */ public static IMOOCJSONResult errorUserTicket(String msg) { return new IMOOCJSONResult(557, msg, null); } /** * 业务产生501“bean验证错误,不管多少个错误都以map形式返回”的这个错误时, * 可以通过这个方法,得到对应的IMOOCJSONResult对象:501,“error”,data; */ public static IMOOCJSONResult errorMap(Object data) { return new IMOOCJSONResult(501, "error", data); } /** * 业务产生502“拦截器拦截到用户token出错”的这个错误时, * 可以通过这个方法,得到对应的IMOOCJSONResult对象:502,msg,null; */ public static IMOOCJSONResult errorTokenMsg(String msg) { return new IMOOCJSONResult(502, msg, null); } /** * 业务产生555“异常抛出信息”时, * 可以通过这个方法,得到对应的IMOOCJSONResult对象:555,msg,null; */ public static IMOOCJSONResult errorException(String msg) { return new IMOOCJSONResult(555, msg, null); } /** * 业务产生556“用户qq校验异常”这个错误时, * 可以通过这个方法,得到对应的IMOOCJSONResult对象:556,msg,null; */ public static IMOOCJSONResult errorUserQQ(String msg) { return new IMOOCJSONResult(556, msg, null); } /** * 无参构造 */ public IMOOCJSONResult() { } /** * 三参构造 */ public IMOOCJSONResult(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } /** * 四参构造 */ public IMOOCJSONResult(Integer status, String msg, Object data, String ok) { this.status = status; this.msg = msg; this.data = data; this.ok = ok; } /** * 一参构造 */ public IMOOCJSONResult(Object data) { this.status = 200; this.msg = "OK"; this.data = data; } public Boolean isOK() { return this.status == 200; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public String getOk() { return ok; } public void setOk(String ok) { this.ok = ok; } }
说明:
(1)这个类是什么作用、为什么要有这个类、什么时候使用,都要很容易理解,就不重复啰嗦;不明白的看代码注释;
(2)只是需要明确以下几点:
● 我们在实际工作中,接口对返回数据的格式要求,一般都是这样的【status,msg,data】;;;但心里要清楚,后端究竟要返回什么格式的数据,是有接口文档规定的,这个需要前端约定好的;
● 当我们在开具体业务的某个接口时候,什么情况返回什么样的具体结果,也时需要遵守接口文档规定的(自然,这个需要前端约定好的),然后我们去调用IMOOCJSONResult对应的方法,得到对应的IMOOCJSONResult对象就行了;
(3)但是,和【Spring Boot电商项目14:用户模块三:API统一返回对象;(其中,涉及了【使用枚举类,来管理接口请求失败时,将要向前端返回的(状态码)和(错误信息)】;)】对比后,发现IMOOCJSONResult存在一些不足:我么应该使用枚举类来管理一些常见的错误信息;完美版的参见下一部分;
二:完美版:ResponseStatusEnum枚举类,GraceJSONResult类;
ResponseStatusEnum枚举类:
package com.imooc.grace.result; /** * 响应结果枚举,用于提供给GraceJSONResult返回给前端的 * 本枚举类中包含了很多的不同的状态码供使用,可以自定义 * 便于更优雅的对状态码进行管理,一目了然 */ public enum ResponseStatusEnum { SUCCESS(200, true, "操作成功!"), FAILED(500, false, "操作失败!"), // 50x UN_LOGIN(501,false,"请登录后再继续操作!"), TICKET_INVALID(502,false,"会话失效,请重新登录!"), NO_AUTH(503,false,"您的权限不足,无法继续操作!"), MOBILE_ERROR(504,false,"短信发送失败,请稍后重试!"), SMS_NEED_WAIT_ERROR(505,false,"短信发送太快啦~请稍后再试!"), SMS_CODE_ERROR(506,false,"验证码过期或不匹配,请稍后再试!"), USER_FROZEN(507,false,"用户已被冻结,请联系管理员!"), USER_UPDATE_ERROR(508,false,"用户信息更新失败,请联系管理员!"), USER_INACTIVE_ERROR(509,false,"请前往[账号设置]修改信息激活后再进行后续操作!"), FILE_UPLOAD_NULL_ERROR(510,false,"文件不能为空,请选择一个文件再上传!"), FILE_UPLOAD_FAILD(511,false,"文件上传失败!"), FILE_FORMATTER_FAILD(512,false,"文件图片格式不支持!"), FILE_MAX_SIZE_ERROR(513,false,"仅支持500kb大小以下的图片上传!"), FILE_NOT_EXIST_ERROR(514,false,"你所查看的文件不存在!"), USER_STATUS_ERROR(515,false,"用户状态参数出错!"), // 自定义系统级别异常 54x SYSTEM_INDEX_OUT_OF_BOUNDS(541, false, "系统错误,数组越界!"), SYSTEM_ARITHMETIC_BY_ZERO(542, false, "系统错误,无法除零!"), SYSTEM_NULL_POINTER(543, false, "系统错误,空指针!"), SYSTEM_NUMBER_FORMAT(544, false, "系统错误,数字转换异常!"), SYSTEM_PARSE(545, false, "系统错误,解析异常!"), SYSTEM_IO(546, false, "系统错误,IO输入输出异常!"), SYSTEM_FILE_NOT_FOUND(547, false, "系统错误,文件未找到!"), SYSTEM_CLASS_CAST(548, false, "系统错误,类型强制转换错误!"), SYSTEM_PARSER_ERROR(549, false, "系统错误,解析出错!"), SYSTEM_DATE_PARSER_ERROR(550, false, "系统错误,日期解析出错!"), // admin 管理系统 56x ADMIN_USERNAME_NULL_ERROR(561, false, "管理员登录名不能为空!"), ADMIN_USERNAME_EXIST_ERROR(562, false, "管理员登录名已存在!"), ADMIN_NAME_NULL_ERROR(563, false, "管理员负责人不能为空!"), ADMIN_PASSWORD_ERROR(564, false, "密码不能为空或则两次输入不一致!"), ADMIN_CREATE_ERROR(565, false, "添加管理员失败!"), ADMIN_PASSWORD_NULL_ERROR(566, false, "密码不能为空!"), ADMIN_NOT_EXIT_ERROR(567, false, "管理员不存在或密码错误!"), ADMIN_FACE_NULL_ERROR(568, false, "人脸信息不能为空!"), ADMIN_FACE_LOGIN_ERROR(569, false, "人脸识别失败,请重试!"), CATEGORY_EXIST_ERROR(570, false, "文章分类已存在,请换一个分类名!"), // 媒体中心 相关错误 58x ARTICLE_COVER_NOT_EXIST_ERROR(580, false, "文章封面不存在,请选择一个!"), ARTICLE_CATEGORY_NOT_EXIST_ERROR(581, false, "请选择正确的文章领域!"), ARTICLE_CREATE_ERROR(582, false, "创建文章失败,请重试或联系管理员!"), ARTICLE_QUERY_PARAMS_ERROR(583, false, "文章列表查询参数错误!"), ARTICLE_DELETE_ERROR(584, false, "文章删除失败!"), ARTICLE_WITHDRAW_ERROR(585, false, "文章撤回失败!"), ARTICLE_REVIEW_ERROR(585, false, "文章审核出错!"), ARTICLE_ALREADY_READ_ERROR(586, false, "文章重复阅读!"), // 人脸识别错误代码 FACE_VERIFY_TYPE_ERROR(600, false, "人脸比对验证类型不正确!"), FACE_VERIFY_LOGIN_ERROR(601, false, "人脸登录失败!"), // 系统错误,未预期的错误 555 SYSTEM_ERROR(555, false, "系统繁忙,请稍后再试!"), SYSTEM_OPERATION_ERROR(556, false, "操作失败,请重试或联系管理员"), SYSTEM_RESPONSE_NO_INFO(557, false, ""); // 响应业务状态 private Integer status; // 调用是否成功 private Boolean success; // 响应消息,可以为成功或者失败的消息 private String msg; ResponseStatusEnum(Integer status, Boolean success, String msg) { this.status = status; this.success = success; this.msg = msg; } public Integer status() { return status; } public Boolean success() { return success; } public String msg() { return msg; } }
说明:
(1)有关枚举类的内容,可以参考【Spring Boot电商项目13:用户模块二:枚举类;(和【枚举数据类型】相比,【枚举类】可以管理一些复杂数据)】 ;枚举类数据类型、枚举类都还好,很容易理解;
GraceJSONResult类:
package com.imooc.grace.result; import java.util.Map; /** * 自定义响应数据类型枚举升级版本 * * @Title: IMOOCJSONResult.java * @Package com.imooc.utils * @Description: 自定义响应数据结构 * 本类可提供给 H5/ios/安卓/公众号/小程序 使用 * 前端接受此类数据(json object)后,可自行根据业务去实现相关功能 * * @Copyright: Copyright (c) 2020 * @Company: www.imooc.com * @author 慕课网 - 风间影月 * @version V2.0 */ public class GraceJSONResult { // 响应业务状态码 private Integer status; // 响应消息 private String msg; // 是否成功 private Boolean success; // 响应数据,可以是Object,也可以是List或Map等 private Object data; /** * 成功返回,带有数据的,直接往OK方法丢data数据即可 * @param data * @return */ public static GraceJSONResult ok(Object data) { return new GraceJSONResult(data); } /** * 成功返回,不带有数据的,直接调用ok方法,data无须传入(其实就是null) * @return */ public static GraceJSONResult ok() { return new GraceJSONResult(ResponseStatusEnum.SUCCESS); } /** * 单参构造;操作成功,且有返回数据时,可以通过这个构造函数得到对应的GraceJSONResult对象。 */ public GraceJSONResult(Object data) { this.status = ResponseStatusEnum.SUCCESS.status(); this.msg = ResponseStatusEnum.SUCCESS.msg(); this.success = ResponseStatusEnum.SUCCESS.success(); this.data = data; } /** * 对于【某些错误】并且【没有data数据】的情况(使用默认的500错误),可以调用这个方法,来获取对应的GraceJSONResult对象; * (错误返回,直接调用error方法即可,当然也可以在ResponseStatusEnum中自定义错误后再返回也都可以) * @return */ public static GraceJSONResult error() { return new GraceJSONResult(ResponseStatusEnum.FAILED); } /** * 对于【某些错误】并且【有data数据】的情况(使用默认的500错误),可以调用这个方法,来获取对应的GraceJSONResult对象; * (错误返回,map中包含了多条错误信息,可以用于表单验证,把错误统一的全部返回出去) */ public static GraceJSONResult errorMap(Map map) { return new GraceJSONResult(ResponseStatusEnum.FAILED, map); } /** * 对于【某些错误】并且【有msg】的情况(使用默认的500错误),可以调用这个方法,来获取对应的GraceJSONResult对象; * (错误返回,直接返回错误的消息) */ public static GraceJSONResult errorMsg(String msg) { return new GraceJSONResult(ResponseStatusEnum.FAILED, msg); } /** * 对于【登录信息失效】并且【没有data数据】的情况,可以调用这个方法,来获取对应的GraceJSONResult对象; * (错误返回,token异常,一些通用的可以在这里统一定义) */ public static GraceJSONResult errorTicket() { return new GraceJSONResult(ResponseStatusEnum.TICKET_INVALID); } /** * 一个通用的,在【出现错误】并且【没有data数据】时,获取对应的GraceJSONResult对象的方法; * 这个,主要是针对error的那种错误; * (自定义错误范围,需要传入一个自定义的枚举,可以到[ResponseStatusEnum.java[中自定义后再传入) */ public static GraceJSONResult errorCustom(ResponseStatusEnum responseStatus) { return new GraceJSONResult(responseStatus); } /** * 一个通用的,在【出现错误】并且【没有data数据】时,获取对应的GraceJSONResult对象的方法; * 这个主要是针对exception异常的,那种错误; */ public static GraceJSONResult exception(ResponseStatusEnum responseStatus) { return new GraceJSONResult(responseStatus); } /** * 单参构造:没有data; */ public GraceJSONResult(ResponseStatusEnum responseStatus) { this.status = responseStatus.status(); this.msg = responseStatus.msg(); this.success = responseStatus.success(); } /** * 双参构造:有data; */ public GraceJSONResult(ResponseStatusEnum responseStatus, Object data) { this.status = responseStatus.status(); this.msg = responseStatus.msg(); this.success = responseStatus.success(); this.data = data; } /** * 双参构造:自定义msg; */ public GraceJSONResult(ResponseStatusEnum responseStatus, String msg) { this.status = responseStatus.status(); this.msg = msg; this.success = responseStatus.success(); } public GraceJSONResult() { } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Boolean getSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; } }
说明:
(1)PS:这个类中的方法,排版稍微有点小乱;而且,方法的职能的划分和规划,方法的类别有点小乱;;;;在实际中,自我感觉不太建议参考这儿的方法排版和规划方式,而是应该参考【Spring Boot电商项目14:用户模块三:API统一返回对象;(其中,涉及了【使用枚举类,来管理接口请求失败时,将要向前端返回的(状态码)和(错误信息)】;)】中的内容;
(2)这类很容易理解,看注释;
(3)在实际工作中,一般的套路就是:在业务代码中,遇到错误时,会使用枚举类相应的错误,去快速构建API统一返回对象;
实测;