Springboot项目中如何设计一个规范的统一的Restful API 响应框架?

简介: Springboot项目中如何设计一个规范的统一的Restful API 响应框架?

一、设计

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

目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。

返回的统一接口形式应该包含这些内容

  1. 是否响应成功
  2. 响应状态码
  3. 状态码描述
  4. 响应数据
  5. 接口调用时间
  6. 其他标识符

按照这些我们可以定义统一的标准结果返回

二、响应枚举

前三者可以定义为 success,code,message

package com.tigerhhzz.springbootmybatisplusdemo.domain;
import lombok.Getter;
/**
 * @author tigerhhzz
 * @date 2023/5/10 9:28
 * 响应结果枚举
 */
@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格式,可定义为JsonObject或Map形式
package com.tigerhhzz.springbootmybatisplusdemo.domain;
import java.util.HashMap;
import java.util.Map;
/**
 * @author tigerhhzz
 * @date 2023/5/10 9:31
 * 统一响应结果处理  使用链式编程 返回类本身
 */
public class CommonRespResult {
    private Boolean success;
    private Integer code;
    private String message;
    /**
     * 接口请求时间戳
     */
    private Long timestamp;
    private Map<String, Object> data = new HashMap<>();
    private CommonRespResult setSuccess(Boolean success) {
        this.success = success;
        return this;
    }
    private CommonRespResult setMessage(String message) {
        this.message = message;
        return this;
    }
    private CommonRespResult setData(Map<String, Object> data) {
        this.data = data;
        return this;
    }
    private CommonRespResult setCode(Integer code) {
        this.code = code;
        return this;
    }
    private CommonRespResult() {
    }
    private CommonRespResult(Long timestamp) {
        this.timestamp = timestamp;
    }
    /**
     * 通用返回成功
     *
     * @return
     */
    public static CommonRespResult success() {
        return new CommonRespResult(System.currentTimeMillis())
                .setSuccess(ResultCodeEnum.SUCCESS.getSuccess())
                .setCode(ResultCodeEnum.SUCCESS.getCode())
                .setMessage(ResultCodeEnum.SUCCESS.getMessage());
    }
    /**
     * 通用返回失败
     *
     * @return
     */
    public static CommonRespResult failure() {
        return new CommonRespResult(System.currentTimeMillis())
                .setSuccess(ResultCodeEnum.FAIL.getSuccess())
                .setCode(ResultCodeEnum.FAIL.getCode())
                .setMessage(ResultCodeEnum.FAIL.getMessage());
    }
    /**
     * 设置结果,形参为结果枚举
     *
     * @param result
     * @return
     */
    public static CommonRespResult setResult(ResultCodeEnum result) {
        return new CommonRespResult(System.currentTimeMillis())
                .setSuccess(result.getSuccess())
                .setCode(result.getCode())
                .setMessage(result.getMessage());
    }
    // 自定义返回数据
    public CommonRespResult data(Map<String, Object> map) {
        return this.setData(map);
    }
    // 通用设置data
    public CommonRespResult data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }
    // 自定义状态信息
    public CommonRespResult message(String message) {
        return this.setMessage(message);
    }
    // 自定义状态码
    public CommonRespResult code(Integer code) {
        return this.setCode(code);
    }
    // 自定义返回结果
    public CommonRespResult success(Boolean success) {
        return this.setSuccess(success);
    }
}

四、控制层调用返回

package com.tigerhhzz.springbootmybatisplusdemo.controller;
import com.tigerhhzz.springbootmybatisplusdemo.domain.CommonRespResult;
import com.tigerhhzz.springbootmybatisplusdemo.domain.MBlog;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author tigerhhzz
 * @since 2023-04-28
 */
@RestController
public class MBlogController {
    @GetMapping("/index")
    public CommonRespResult index() {
        Map m = new HashMap();
        m.put("name", "Tom");
        m.put("age", 25);
        m.put("sex", "男");
        return CommonRespResult.success().data(m);
    }
    @GetMapping("/home")
    public CommonRespResult home() {
        MBlog mBlog = new MBlog();
        mBlog.setContent("DFSDFSDFSDFSD");
        mBlog.setTitle("FFDSFD");
        return CommonRespResult.success().data("mBlog",mBlog).message("查询用户详情信息");
    }
    /**
     * 异常返回模拟
     *
     * @return
     */
    @GetMapping("/exception")
    public CommonRespResult exception() {
        Map m = null;
        m.put("name", "Jack");
        return CommonRespResult.success().data("user", m).message("查询用户详情信息");
    }
}

统一结果类的使用参考了mybatis-plus中Result对象的设计。

目录
相关文章
|
28天前
|
API
用 Koa 框架实现一个简单的 RESTful API
用 Koa 框架实现一个简单的 RESTful API
|
15天前
|
XML 安全 Java
|
18天前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
26 0
|
11天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
43 8
|
21天前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
34 6
|
25天前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
26 2
|
26天前
|
Java 数据库连接 数据库
不可不知道的Spring 框架七大模块
Spring框架是一个全面的Java企业级应用开发框架,其核心容器模块为其他模块提供基础支持,包括Beans、Core、Context和SpEL四大子模块;数据访问及集成模块支持数据库操作,涵盖JDBC、ORM、OXM、JMS和Transactions;Web模块则专注于Web应用,提供Servlet、WebSocket等功能;此外,还包括AOP、Aspects、Instrumentation、Messaging和Test等辅助模块,共同构建强大的企业级应用解决方案。
47 2
|
27天前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
38 2
|
25天前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
27 0
|
26天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
35 0