如果当初有一个Java我的项目,老板让你做我的项目组长,定义我的项目根底框架,零碎技术架构选型,
你应该如何设计一个标准的对立的Restful API 响应框架呢

思考

目前我的项目开发,都是基于前后端拆散模式开发的,基于后端模板引擎那一套,可能曾经不实用一些我的项目开发流程,和当下开发模式了,尤其在要写比拟大型项目,前后端我的项目拆分,团队共同开发那是必不可少的

目前的前后端开发大部分数据的传输格局都是json,因而定义一个对立标准的数据格式有利于前后端的交互与UI的展现。

返回的对立接口模式应该蕴含这些内容

  1. 是否响应胜利
  2. 响应状态码
  3. 状态码形容
  4. 响应数据
  5. 接口调用工夫
  6. 其余标识符

依照这些咱们能够定义对立的规范后果返回

响应枚举

前三者能够定义为 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格局,可定义为JsonObjectMap模式
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对象返回。

这个时候该如何解决

下一篇文章会持续分享,留下你的思考

筹备从零做一套本人的开发脚手架模板 ,关注公众 程序员三时