广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解SpringBoot如何实现统一后端返回格式
  • 740
分享到

详解SpringBoot如何实现统一后端返回格式

2024-04-02 19:04:59 740人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.为什么要对SpringBoot返回统一的标准格式1.1 返回String1.2 返回自定义对象1.3 接口异常2.定义返回对象3.定义状态码4.统一返回格式5.高级实现方式5

在前后端分离的项目中后端返回的格式一定要友好,不然会对前端开发人员带来很多的工作量。那么springBoot如何做到统一的后端返回格式呢?今天我们一起来看看。

1.为什么要对SpringBoot返回统一的标准格式

在默认情况下,SpringBoot的返回格式常见的有三种:

1.1 返回String

@GetMapping("/hello")
public String hello() {
    return  "hello";
}

此时调用接口获取到的返回值是这样:

hello

1.2 返回自定义对象

@GetMapping("/student")
public Student getStudent() {
        Student student = new Student();
        student.setId(1);
        student.setName("didiplus");
        return  student;
}


//student的类
@Data
public class Student {
    private Integer id;
    private String name;
}

此时调用接口获取到的返回值是这样:

{"id":1,"name":"didiplus"}

1.3 接口异常

@GetMapping("/error")
public int error(){
    int i = 9/0;
    return i;
}

此时调用接口获取到的返回值是这样

SpringBoot的版本是v2.6.7,

2.定义返回对象

package com.didiplus.common.WEB.response;

import lombok.Data;

import java.io.Serializable;



@Data
public class Result<T> implements Serializable {

    
    private boolean success;

    
    private int code;

    
    private String msg;

    
    private T data;

    
    private long timestamp ;


    public Result (){
        this.timestamp = System.currentTimeMillis();
    }
    
    public static <T> Result<T> success() {
        return  success(null);
    }

    
    public static <T> Result<T> success(T data){
        return success(ResultCode.RC100.getMessage(),data);
    }

    
    public static <T> Result<T> success(String message) {
        return success(message, null);
    }

        
    public static <T> Result<T> success(String message, T data) {
        return success(ResultCode.RC100.getCode(), message, data);
    }

    
    public static <T> Result<T> success(int code, String message) {
        return success(code, message, null);
    }

    public static <T> Result<T> success(int code,String message,T data) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setSuccess(true);
        result.setData(data);
        return result;
    }

    
    public static <T> Result<T> failure() {
        return failure(ResultCode.RC100.getMessage());
    }

    
    public static <T> Result<T> failure(String message) {
        return failure(message, null);
    }

    
    public static <T> Result<T> failure(String message, T data) {
        return failure(ResultCode.RC999.getCode(), message, data);
    }

    
    public static <T> Result<T> failure(int code, String message) {
        return failure(ResultCode.RC999.getCode(), message, null);
    }

    
    public static <T> Result<T> failure(int code, String message, T data) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setSuccess(false);
        result.setData(data);
        return result;
    }

    
    public static <T> Result<T> decide(boolean b) {
        return decide(b, ResultCode.RC100.getMessage(), ResultCode.RC999.getMessage());
    }

    
    public static <T> Result<T> decide(boolean b, String success, String failure) {
        if (b) {
            return success(success);
        } else {
            return failure(failure);
        }
    }
}

3.定义状态码

package com.didiplus.common.web.response;

import lombok.Getter;


public enum ResultCode {
    
    RC100(100,"操作成功"),
    
    RC999(999,"操作失败"),
    
    RC200(200,"服务开启限流保护,请稍后再试!"),
    
    RC201(201,"服务开启降级保护,请稍后再试!"),
    
    RC202(202,"热点参数限流,请稍后再试!"),
    
    RC203(203,"系统规则不满足要求,请稍后再试!"),
    
    RC204(204,"授权规则不通过,请稍后再试!"),
    
    RC403(403,"无访问权限,请联系管理员授予权限"),
    
    RC401(401,"匿名用户访问无权限资源时的异常"),
    
    RC500(500,"系统异常,请稍后重试"),

    INVALID_TOKEN(2001,"访问令牌不合法"),
    ACCESS_DENIED(2003,"没有权限访问该资源"),
    CLIENT_AUTHENTICATION_FAILED(1001,"客户端认证失败"),
    USERNAME_OR_PASSWord_ERROR(1002,"用户名或密码错误"),
    UNSUPPORTED_GRANT_TYPE(1003, "不支持的认证模式");

    
    @Getter
    private final int code;

    
    @Getter
    private final String message;
    
    ResultCode(int code, String message) {

        this.code = code;

        this.message = message;
    }
}

4.统一返回格式

    @GetMapping("/hello")
    public Result<String> hello() {
        return  Result.success("操作成功","hello");
    }

此时调用接口获取到的返回值是这样:

{"success":true,"code":100,"msg":"操作成功","data":"hello","timestamp":1650785058049}

这样确实已经实现了我们想要的结果,我在很多项目中看到的都是这种写法,在Controller层通过Result.success()对返回结果进行包装后返回给前端。这样显得不够专业而且不够优雅。 所以呢我们需要对代码进行优化,目标就是不要每个接口都手工制定Result返回值。

5.高级实现方式

要优化这段代码很简单,我们只需要借助SpringBoot提供的ResponseBodyAdvice即可。

5.1 ResponseBodyAdvice的源码

public interface ResponseBodyAdvice<T> {
		
    boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2);

	  
    @Nullable
    T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}

只需要编写一个具体实现类即可

@RestControllerAdvice
public class ResponseAdvice  implements ResponseBodyAdvice<Object> {


    @Autowired
    ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response)  {
        if (body instanceof  String){
            return objectMapper.writeValueAsString(Result.success(ResultCode.RC100.getMessage(),body));
        }
        return Result.success(ResultCode.RC100.getMessage(),body);
    }
}

需要注意两个地方:

@RestControllerAdvice注解 @RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:

  • 全局异常处理
  • 全局数据绑定
  • 全局数据预处理

5.2 String类型判断

        if (body instanceof  String){
            return objectMapper.writeValueAsString(Result.success(ResultCode.RC100.getMessage(),body));
        }

这段代码一定要加,如果Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成JSON。 经过上面的处理我们就再也不需要通过ResultData.success()来进行转换了,直接返回原始数据格式,SpringBoot自动帮我们实现包装类的封装。

    @GetMapping("/hello")
    public String hello() {
        return "hello,didiplus";
    }


    @GetMapping("/student")
    public Student getStudent() {
        Student student = new Student();
        student.setId(1);
        student.setName("didiplus");
        return student;
    }

此时我们调用接口返回的数据结果为:

{ "success": true, "code": 100, "msg": "操作成功", "data": "hello,didiplus", "timestamp": 1650786993454 }

以上就是详解SpringBoot如何实现统一后端返回格式的详细内容,更多关于SpringBoot统一后端返回格式的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解SpringBoot如何实现统一后端返回格式

本文链接: https://www.lsjlt.com/news/147398.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解SpringBoot如何实现统一后端返回格式
    目录1.为什么要对SpringBoot返回统一的标准格式1.1 返回String1.2 返回自定义对象1.3 接口异常2.定义返回对象3.定义状态码4.统一返回格式5.高级实现方式5...
    99+
    2022-11-13
  • 详解SpringBoot如何统一后端返回格式
    目录为什么要对SpringBoot返回统一的标准格式第一种:返回 String第二种:返回自定义对象第三种:接口异常定义返回标准格式高级实现方式接口异常问题SpringBoot为什么...
    99+
    2022-11-12
  • SpringBoot如何统一后端返回格式
    这篇文章主要讲解了“SpringBoot如何统一后端返回格式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot如何统一后端返回格式”吧!目录为什么要对SpringBoot返回...
    99+
    2023-06-20
  • 详解SpringBoot 统一后端返回格式的方法
    目录为什么要对SpringBoot返回统一的标准格式定义返回标准格式定义返回对象定义状态码统一返回格式高级实现方式接口异常问题SpringBoot为什么需要全局异常处理器如何实现全局...
    99+
    2022-11-13
  • SpringBoot怎么实现统一后端返回格式
    这篇文章主要介绍“SpringBoot怎么实现统一后端返回格式”,在日常操作中,相信很多人在SpringBoot怎么实现统一后端返回格式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot怎么实...
    99+
    2023-06-30
  • SpringBoot统一返回JSON格式实现方法详解
    目录定义JSON格式定义JavaBean字段定义返回体类Result实体返回测试统一返回JSON格式进阶全局处理(@RestControllerAdvice)@ResponseBod...
    99+
    2023-02-03
    SpringBoot返回JSON格式 SpringBoot无侵入式返回JSON格式
  • SpringBoot统一返回格式的方法详解
    目录前言1. 直接返回结果2. 约定返回格式3. 返回统一格式结果4. 切片封装统一格式编写注解编写ControllerAdvice见证奇迹的时刻到了5. 自定义返回格式场景1:返回...
    99+
    2022-11-13
  • SpringBoot返回统一的JSON标准格式实现步骤
    期望返回的JSON格式如下 { "code": 200, "msg": "操作成功", "data": "hello jenkins" } 实现步骤如下 1.自定义...
    99+
    2022-11-12
  • SpringBoot如何实现统一封装返回前端结果集
    这篇文章主要介绍了SpringBoot如何实现统一封装返回前端结果集的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot如何实现统一封装返回前端结果集文章都会有所收获,下面我们一起来看看吧。我们如...
    99+
    2023-07-02
  • 如何设计API接口实现统一格式返回
    这篇文章给大家介绍如何设计API接口实现统一格式返回,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职...
    99+
    2023-06-05
  • 详解如何在SpringBoot项目中使用统一返回结果
    目录1.创建Spring Boot项目2.返回结果的封装3.后端接口实现3.1 创建实体类3.2 创建dao层3.3 创建Controller层4.前端部分5.验证在一个完整的项目中...
    99+
    2022-11-13
    SpringBoot使用统一返回结果 SpringBoot 统一返回结果 SpringBoot 返回结果
  • 后端接口返回文件流格式、前端如何实现文件下载导出呢?
    在项目开发过程中,难免会需要实现文件下载功能,记录下自己实际开发过程过程中遇到两种实现的方式。一种:后端直接返回加密url ,前端解密后直接使用 a标签下载就可以,这种方法相等比较简单,另一种:后端接...
    99+
    2023-09-02
    前端 java javascript
  • 一文详解如何根据后端返回的url下载json文件
    目录需求场景描述实现思路分析完整的 demo 示例总结需求场景描述 有时候会遇到异步接口会返回一个 url 地址,然后前端需要根据这个 url 地址去下载文件资源的需求场景。 而这个...
    99+
    2022-11-13
  • SpringBoot中如何统一接口返回与全局异常处理详解
    目录背景 统一接口返回 定义API返回码枚举类 定义正常响应的API统一返回体定义异常响应的API统一返回体编写包装返回结果的自定义注解定义返回结果拦截器WebMvc配置类拦截器注册...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作