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对象的设计。

目录
相关文章
|
6天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
15天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
27 0
|
1天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
21 1
SpringBoot获取项目文件的绝对路径和相对路径
|
10天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
31 1
Spring 框架:Java 开发者的春天
|
2天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
10 2
|
2天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
41 1
|
3天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
15 2
|
3天前
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
14 2
|
3天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
15 1
|
10天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。