关于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对象返回。

这个时候该如何解决

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理