引言
选用静态页面的形式开展新项目开发设计,那麼前后左右端互动比较好的形式是选用HTTP JSON。怎么让插口返回結果更为简约,更为雅致,也更为有效,而且让网页开发工作人员看得搞清楚,后端工程师者也并不会因而而提升劳动量呢?
文章正文逐渐Hello,诸位,朋友一场了。一直在筹备本人网站2020版本号重做的事儿,因此,这篇文章内容,也是2019年最终一篇了,自然,也得花一些想法,争得把我想要说得话,都一一说出来,说搞清楚,说深入。
选用静态页面的形式开展新项目开发设计,那麼前后左右端互动比较好的形式是选用HTTP JSON。怎么让插口返回結果更为简约,更为雅致,也更为有效,而且让网页开发工作人员看得搞清楚,后端工程师者也并不会因而而提升劳动量呢?
因此,我写了一套有关API接口开发返回結果解决方法, api-result,已经将其开源系统,并上传入中央仓库,热烈欢迎诸位指责和纠正。
API解读实体类给予了达到各情景应用的实体类,如下所示:
ResultModel这一类是基本实体类,有如下所示属性:
success:返回結果标志,是一个布尔值,true / false(取得成功 / 不成功)
message:描述信息,不正确时,可以在这儿填好问题的详尽信息
data:数据信息,是一个泛型,可以是二维数组或是目标这些,取得成功而且必须返回数据信息时,才有该主要参数
ApiResultModel构造关联如下所示:
ResultModel └── ApiResultModel在这个类里边提升了 code 属性,也是一个泛型,你能自定你的返回码种类,可以是整数金额,或是字符串数组。
PageResultModel构造关联如下所示:
ResultModel └── PageResultModel这一类关键主要分页查询返回結果,因此,提升了下列属性:
total:数据信息总总数,Long型
size:每张总数,整数金额
pages:总页码,Long型
current:当页,Long型
Helperjava工具协助大家实际操作实体类,实际有什么helper呢?如下所示:
ResultHelperResultHelper是与ResultModel相匹配的
success(String message)取得成功,携带描述信息
success(String message, T data)成功,携带描述信息和数据信息
error(String message)不正确,携带详尽的描述信息
ApiResultHelperApiResultHelper是与ApiResultModel相匹配的
success(S code, String message)取得成功,携带返回码和描述信息
success(S code, String message, T data)成功,携带返回码、描述信息和数据信息
error(S code, String message)不正确,携带错误代码和详尽描述信息
PageResultHelperPageResultHelper是与PageResultModel相匹配的
success(String message)取得成功,携带描述信息
success(String message, T data)成功,携带描述信息和数据信息
success(String message, T data, long total, int size, long pages, long current)取得成功,携带描述信息、数据信息、数量、每张总数、总页码、当页
error(String message)不正确,携带详尽的描述信息
快速入门大家给你带来了三个实体类,以达到不一样情景,ResultModel适用通常返回結果,ApiResultModel适用接口开发返回結果,PageResultModel适用分页查询返回結果。也各自为这三个实体类给予了自己的Helper,因此,你能立即应用这种Helper开展返回。自然,推存的应用方法是,先为各Helper撰写java工具,再根据java工具开展返回,那样很有可能更为有效订制自个的返回java工具。
运用Helper开展返回最先让我们看来一个简便的实例编码:
/** * 加上方式实例 * @return {@link ResultModel} */@ApiOperation(value = "加上方式实例")@PostMappingpublic ResultModel<?> add() { return ResultHelper.success("加上取得成功");}返回結果:
{ "success": true, "message": "加上取得成功"}注:这仅仅一个插口返回实例,而不是说加上插口应当那样写。
撰写返回結果java工具例如,我们可以写一个ResultUtilsjava工具来实际操作ResultHelper。如下所示实例:
/** * 取得成功实例 * @return {@link ResultModel} */public static ResultModel <?> success() { return ResultHelper.success("Success");}应用返回結果java工具我们就可以启用ResultUtils类里边的方式,如下所示实例:
java /** * 取得成功实例 * @return {@link ResultModel} */ @ApiOperation(value = "取得成功实例") @DeleteMapping public ResultModel<?> success() { return ResultUtils.success(); }
印像結果:
json { "success": true, "message": "Success" }
应用实例示例图测试接口浏览Models返回取得成功結果实例/** * 删掉方式实例 * @return {@link ResultModel} */@ApiOperation(value = "删掉方式实例")@DeleteMappingpublic ResultModel<?> delete() { return ResultUtils.success();}回应結果:
{ "success": true, "message": "Success"}返回不成功結果实例假如实际操作出错了,大家如何返回呢?大家来说一下:
/** * 改动方式实例 * @return {@link ResultModel} */@ApiOperation(value = "改动方式实例")@PutMappingpublic ResultModel<?> update() { return ResultUtils.error("改动不成功");}返回結果:
{ "success": false, "message": "改动不成功"}返回查询记录实例值得一提得话,便是如何查询了,大家看一下吧
/** * 如何查询实例 * @return {@link ResultModel} */@ApiOperation(value = "如何查询实例")@GetMappingpublic ResultModel<?> get() { List<Map<String, String>> list = new ArrayList<>(); Map<String, String> ** p1 = new HashMap<>(); ** p1.put("name", "赵云"); ** p1.put("desc", "燕人张飞"); list.add( ** p1); Map<String, String> ** p2 = new HashMap<>(); ** p2.put("name", "赵子龙"); ** p2.put("desc", "常山赵子龙"); list.add( ** p2); Map<String, String> ** p3 = new HashMap<>(); ** p3.put("name", "关云长"); ** p3.put("desc", "斩颜良诛文丑"); list.add( ** p3); return ResultUtils.success(list);}看一下回应結果吧,是不是得偿所愿:
{ "success": true, "message": "Success", "data": [ { "name": "赵云", "desc": "燕人张飞" }, { "name": "赵子龙", "desc": "常山赵子龙" }, { "name": "关云长", "desc": "斩颜良诛文丑" } ]}插口返回数据信息实例java /** * 插口返回数据信息实例 * @return {@link ApiResultModel} */ @ApiOperation(value = "插口返回数据信息实例") @GetMapping("/api-data") public ApiResultModel<Integer, ?> apiData() { return ApiResultUtils.success(getData()); }
回应結果:
{ "success": true, "message": "Success", "data": [ { "name": "赵云", "desc": "燕人张飞" }, { "name": "赵子龙", "desc": "常山赵子龙" }, { "name": "关云长", "desc": "斩颜良诛文丑" } ], "code": 0}插口返回不成功結果实例/** * API插口不正确返回实例 * @return {@link ApiResultModel} */@ApiOperation(value = "API插口不正确返回实例")@GetMapping("/api-error")public ApiResultModel<Integer, ?> apiError() { return ApiResultUtils.error(1101, "API插口不正确返回实例");}回应結果:
{ "success": false, "message": "API接口错误返回示例", "code": 1101}分页返回数据示例/** * 分页返回数据示例 * @return {@link ApiResultModel} */@ApiOperation(value = "分页返回数据示例")@GetMapping("/page")public PageResultModel<?> page() { return PageResultUtils.success(getData(), 100, 10, 10, 1);}响应结果:
{ "success": true, "message": "Success", "data": [ { "name": "张飞", "desc": "燕人张飞" }, { "name": "赵云", "desc": "常山赵子龙" }, { "name": "关羽", "desc": "温酒斩华雄" } ], "total": 100, "size": 10, "pages": 10, "current": 1}工具类示例返回结果工具类package com.fengwenyi.api_example.util;import com.fengwenyi.api_result.helper.ResultHelper;import com.fengwenyi.api_result.model.ResultModel;/** * 返回结果封装工具类 * @author Erwin Feng[xfsy_2015@163.com] * @since 2019/11/30 13:54 */public class ResultUtils { /** * 成功 * @return {@link ResultModel} */ public static ResultModel <?> success() { return ResultHelper.success("Success"); } /** * 成功,携带数据 * @param data 数据 * @param <T> 数据的类型 * @return {@link ResultModel} */ public static <T> ResultModel <T> success(T data) { return ResultHelper.success("Success", data); } /** * 错误,携带详细的错误描述信息 * @param message 详细的错误描述信息 * @return {@link ResultModel} */ public static ResultModel <?> error(String message) { return ResultHelper.error(message); }}API接口返回结果工具类package com.fengwenyi.api_example.util;import com.fengwenyi.api_result.helper.ApiResultHelper;import com.fengwenyi.api_result.model.ApiResultModel;/** * API接口返回结果工具类 * @author Erwin Feng[xfsy_2015@163.com] * @since 2019/12/1 20:10 */public class ApiResultUtils { /** * 成功,携带返回码和描述信息 * @return {@link ApiResultModel} */ public static ApiResultModel<Integer, ?> success() { return ApiResultHelper.success(0, "Success"); } /** * 成功,携带返回码、描述信息和数据 * @param data 数据 * @param <T> 数据的类型 * @return {@link ApiResultModel} */ public static <T> ApiResultModel<Integer, T> success(T data) { return ApiResultHelper.success(0, "Success", data); } /** * 出错,携带错误吗和详细描述信息 * @param code 返回码 * @param message 相信描述信息 * @return {@link ApiResultModel} */ public static ApiResultModel<Integer, ?> error(int code, String message) { return ApiResultHelper.error(code, message); }}分页返回结果工具类package com.fengwenyi.api_example.util;import com.fengwenyi.api_result.helper.PageResultHelper;import com.fengwenyi.api_result.model.PageResultModel;/** * 分页返回结果工具类 * @author Erwin Feng[xfsy_2015@163.com] * @since 2019/12/1 20:32 */public class PageResultUtils { /** * 成功,携带分页相关数据以及信息 * @param data 数据 * @param total 数据总条数 * @param size 每页条数 * @param pages 总页数 * @param current 当前页 * @param <T> 数据类型 * @return {@link PageResultModel} */ public static <T> PageResultModel<T> success(T data, long total, int size, long pages, long current) { return PageResultHelper.success("Success", data, total, size, pages, current); }}解析返回结果示例这里补充一下,关于如何解析返回的json字符串,谈谈我的看法吧。返回的是一个json格式的字符串,这里我用fastjson来写解析示例。我们通常会将请求数据封装为一个通用方法或者工具类,只需要返回数据,当然,如果失败,或者出现异常,都在这里处理。
常用返回结果解析示例/** * 解析常用返回结果示例 * @return 数据 */public Object parseResult() { String result = ""; ResultModel<?> resultModel = JSON.parseObject(result, ResultModel.class); Boolean success = resultModel.getSuccess(); if (success != null && success) { return resultModel.getData(); } else { // 异常信息 String message = resultModel.getMessage(); // 异常处理 throw new DataParseException(message); }}接口返回结果解析示例/** * 解析接口返回结果示例 * @return 数据 */public Object parseApiResult() { String apiResult = ""; ApiResultModel<?, ?> apiResultModel = JSON.parseObject(apiResult, ApiResultModel.class); Boolean success = apiResultModel.getSuccess(); if (success != null && success) { return apiResultModel.getData(); } else { Object code = apiResultModel.getCode(); String message = apiResultModel.getMessage(); // 根据接口错误码分别进行处理 // ... return null; }}分页返回结果解析示例这里与上面略有不同,因为,增加了一些字段,所以,我们可以借助bean来返回。
/** * 解析分页返回结果示例 * @return {@link PageResultDataBean} */public PageResultDataBean parsePageResult() { String pageResult = ""; PageResultModel<List<?>> pageResultModel = JSON.parseObject(pageResult, PageResultModel.class); Boolean success = pageResultModel.getSuccess(); if (success != null && success) { List<?> data = pageResultModel.getData(); Long total = pageResultModel.getTotal(); Integer size = pageResultModel.getSize(); Long pages = pageResultModel.getPages(); Long current = pageResultModel.getCurrent(); return new PageResultDataBean() .setTotal(total) .setSize(size) .setPages(pages) .setCurrent(current) .setData(data); } else { // 异常信息 String message = pageResultModel.getMessage(); // 异常处理 throw new DataParseException(message); }}以上,这一切都是否如你所愿呢?欢迎评论留言告诉我。
链接[1] api-result源码 | github
[2] api-result源码 | 码云
[3] api-result中央仓库
[4] 测试示例代码
扫码咨询与免费使用
申请免费使用