乐趣区

关于springboot:SpringBoot定义优雅全局统一Restful-API-响应框架

如果当初有一个 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
 * 响应后果枚举
 */
@Getter
public 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
 * 对立响应后果解决  应用链式编程 返回类自身
 */
@Data
public 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
 */
@RestController
public 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 对象返回。

这个时候该如何解决

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

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

退出移动版