如果当初有一个Java我的项目,老板让你做我的项目组长,定义我的项目根底框架,零碎技术架构选型,
你应该如何设计一个标准的对立的Restful API 响应框架呢
思考
目前我的项目开发,都是基于前后端拆散模式开发的,基于后端模板引擎那一套,可能曾经不实用一些我的项目开发流程,和当下开发模式了,尤其在要写比拟大型项目,前后端我的项目拆分,团队共同开发那是必不可少的
目前的前后端开发大部分数据的传输格局都是json,因而定义一个对立标准的数据格式有利于前后端的交互与UI的展现。
返回的对立接口模式应该蕴含这些内容
- 是否响应胜利
- 响应状态码
- 状态码形容
- 响应数据
- 接口调用工夫
- 其余标识符
依照这些咱们能够定义对立的规范后果返回
响应枚举
前三者能够定义为 success,code,message
package cn.soboys.springbootrestfulapi.common.resp;import lombok.Data;import lombok.Getter;import org.springframework.web.bind.annotation.GetMapping;/** * @author 公众号 程序员三时 * @version 1.0 * @date 2023/4/28 22:39 * @webSite https://github.com/coder-amiao * 响应后果枚举 */@Getterpublic enum ResultCodeEnum{ SUCCESS(true, 200, "胜利"), FAIL(false, 400, "申请失败"), NOT_FOUND(false, 404, "接口不存在"), FORBIDDEN(false, 403, "资源回绝拜访"), UNAUTHORIZED(false, 401, "未认证(签名谬误)"), INTERNAL_SERVER_ERROR(false, 500, "服务器外部谬误"), NULL_POINT(false, 200002, "空指针异样"), PARAM_ERROR(false, 200001, "参数谬误"); /** * 响应是否胜利 */ 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; }}
对立后果类
- 内部返回调用类对立的后果办法
success,failure
因而结构器公有 - 内置静态方法,间接返回对象
- 便于自定义对立后果信息,应用链式编程,返回对象类自身
return this
- 响应数据为json格局,可定义为
JsonObject
或Map
模式
package cn.soboys.springbootrestfulapi.common.resp;import lombok.Data;import java.util.HashMap;import java.util.Map;/** * @author 公众号 程序员三时 * @version 1.0 * @date 2023/4/28 22:47 * @webSite https://github.com/coder-amiao * 对立响应后果解决 应用链式编程 返回类自身 */@Datapublic class R { private Boolean success; private Integer code; private String message; /** * 接口申请工夫戳 */ private Long timestamp; private Map<String, Object> data = new HashMap<>(); private R setSuccess(Boolean success) { this.success = success; return this; } private R setMessage(String message) { this.message = message; return this; } private R setData(Map<String, Object> data) { this.data = data; return this; } private R setCode(Integer code) { this.code = code; return this; } private R() { } private R(Long timestamp) { this.timestamp = timestamp; } /** * 通用返回胜利 * * @return */ public static R success() { return new R(System.currentTimeMillis()) .setSuccess(ResultCodeEnum.SUCCESS.getSuccess()) .setCode(ResultCodeEnum.SUCCESS.getCode()) .setMessage(ResultCodeEnum.SUCCESS.getMessage()); } /** * 通用返回失败 * * @return */ public static R failure() { return new R(System.currentTimeMillis()) .setSuccess(ResultCodeEnum.FAIL.getSuccess()) .setCode(ResultCodeEnum.FAIL.getCode()) .setMessage(ResultCodeEnum.FAIL.getMessage()); } /** * 设置后果,形参为后果枚举 * * @param result * @return */ public static R setResult(ResultCodeEnum result) { return new R(System.currentTimeMillis()) .setSuccess(result.getSuccess()) .setCode(result.getCode()) .setMessage(result.getMessage()); } // 自定义返回数据 public R data(Map<String, Object> map) { return this.setData(map); } // 通用设置data public R data(String key, Object value) { this.data.put(key, value); return this; } // 自定义状态信息 public R message(String message) { return this.setMessage(message); } // 自定义状态码 public R code(Integer code) { return this.setCode(code); } // 自定义返回后果 public R success(Boolean success) { return this.setSuccess(success); }}
管制层调用返回
package cn.soboys.springbootrestfulapi.controller;import cn.soboys.springbootrestfulapi.common.resp.R;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.Map;/** * @author 公众号 程序员三时 * @version 1.0 * @date 2023/4/28 23:58 * @webSite https://github.com/coder-amiao */@RestControllerpublic class IndexController { @GetMapping("/index") public R index() { Map m = new HashMap(); m.put("name", "Tom"); m.put("age", 25); m.put("sex", "男"); return R.success().data(m); } @GetMapping("/home") public R home() { Student s = new Student(); s.setUserName("Tom"); s.setBalance(2229891.0892); return R.success().data("user", s).message("查问用户详情信息"); } /** * 异样返回模仿 * * @return */ @GetMapping("/exception") public R exception() { Map m = null; m.put("name", "Jack"); return R.success().data("user", m).message("查问用户详情信息"); }}
对立后果类的应用参考了mybatis-plus中R对象的设计。
问题思考
应用对立返回后果时,还有一种状况,就是程序因为运行时异样导致的后果,有些异样咱们可
能无奈提前预知,不能失常走到咱们return的R对象返回。
这个时候该如何解决
下一篇文章会持续分享,留下你的思考
筹备从零做一套本人的开发脚手架模板 ,关注公众 程序员三时