Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >牛皮的程序猿后端返回值怎么定义

牛皮的程序猿后端返回值怎么定义

原创
作者头像
JavaPub
发布于 2024-06-25 12:48:23
发布于 2024-06-25 12:48:23
1480
举报

在后端接口封装中,我们一般都会对返回的数据做一个封装,以防止系统出现不可预期的数据结构和类型。比如这样:

结构体 1

代码语言:json
AI代码解释
复制
{
  "success": true,
  "code": 200,
  "message": "成功",
  "data": {
    "items": [
      {
        "id": "1",
        "name": "小王",
        "identified": "JavaPub博主"
      }
    ]
  }
}

结构体 2

代码语言:json
AI代码解释
复制
{
    "ret": 200,
    "data": {
        "title": "Default Api",
        "content": "王哥 您好,欢迎使用 apifather!",
        "version": "1.1.0",
        "time": 14231428021
    },
    "msg": ""
}

不论如何定义,多一个或少一个字段,我们都需要统一规范。接下来我们拆解一下,

首先,通过观察,一定要有状态码,也就是案例中的 coderet ,通过状态码可以知道当前程序哪里出了问题,比如 200 就是成功。有同学会问,为何不用 data 来判断,为空或者为 0 就是错误,当然不行。

比如:下面这个结构,data 长度虽然等于 0,但是这属于确实没查到数据,而不是程序出错。

代码语言:json
AI代码解释
复制
{
    "ret": 200,
    "data": [],
    "msg": ""
}

再看 data,这个毋庸置疑,它是接口的核心数据,也是接口对外提供的业务数据。

再看 message 或者称为 msg,它是给状态做一个文字说明。比如,有个老六在定义了一个状态码(666),第一次调用这个接口的同学可能并不知道返回的状态码含义、也不想去查接口文档,我加个描述:(老六的接口不通啦),调用者就一目了然了。

最后看 success 字段,这个字段是为了更规范而加的,方便前端直接将接口响应状态展示。比如:用户登录成功,可以展示一个 true,或者前端在判断时也可以写更简洁的代码 if result.success:。毕竟将(老六的接口不通啦)描述直接展示出来显得不太正式。

基于以上几点,我们的返回结构这样定义:

ApiResponse.class

代码语言:java
AI代码解释
复制
// 定义API响应结构体
public class ApiResponse<T> {
    private int status; // HTTP状态码
    private String message; // 状态信息
    private T data; // 返回的数据,泛型支持返回不同类型的数据

    // 构造函数
    public ApiResponse(ResponseStatus status) {
        this.status = status.getCode();
        this.message = status.getMessage();
    }

    // 带数据的构造函数
    public ApiResponse(ResponseStatus status, T data) {
        this(status);
        this.data = data;
    }

    // Getter和Setter方法
    // ...
}

定义完返回结构后,我们需要定义状态的枚举值。这是为了定一个统一的规范,方便开发时状态码搞混。

代码语言:java
AI代码解释
复制
// 定义状态码枚举
public enum ResponseStatus {
    SUCCESS(200, "操作成功"),
    ERROR(500, "服务器内部错误"),
    BAD_REQUEST(400, "请求参数错误"),
    NOT_FOUND(404, "资源未找到"),
    UNAUTHORIZED(401, "未授权"),
    FORBIDDEN(403, "禁止访问");

    private final int code;
    private final String message;

    ResponseStatus(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

如何使用呢

代码语言:java
AI代码解释
复制
@GetMapping("/users/{id}")
public ResponseEntity<ApiResponse<User>> getUser(@PathVariable Long id) {
    try {
        User user = userService.getUserById(id);
        if (user != null) {
            return ResponseEntity.ok(new ApiResponse<>(ResponseStatus.SUCCESS, user));
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND)
                                 .body(new ApiResponse<>(ResponseStatus.NOT_FOUND));
        }
    } catch (Exception e) {
        // 这里可以根据异常类型返回不同的错误状态码和消息
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                             .body(new ApiResponse<>(ResponseStatus.ERROR));
    }
}

这里使用了 Spring 自带的返回结构体 ResponseEntity 进行封装。

获取到的结果是这样的:

代码语言:json
AI代码解释
复制
{
  "code": 200,
  "message": "操作成功",
  "data": {
    "id": "1",
    "name": "javapub",
    "age": 18
  }
}

原文地址: https://javapub.net.cn/star/project/user-center/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
统一定制API返回格式,我只做了这几件事
转自:blog.csdn.net/qq_34347620/article/details/102239179
猿天地
2020/09/22
2.2K0
Spring Boot 无侵入式 实现 API 接口统一 JSON 格式返回
无侵入式 统一返回JSON格式 其实本没有没打算写这篇博客的,但还是要写一下写这篇博客的起因是因为,现在呆着的这家公司居然没有统一的API返回格式?,询问主管他居然告诉我用HTTP状态码就够用了(fx
架构师修炼
2020/11/19
1.2K0
SpringBoot:如何优雅地进行响应数据封装、异常处理?
越来越多的项目开始基于前后端分离的模式进行开发,这对后端接口的报文格式便有了一定的要求。通常,我们会采用JSON格式作为前后端交换数据格式,从而减少沟通成本等。
程序新视界
2022/09/19
1.9K0
Spring Boot 无侵入式 实现API接口统一JSON格式返回
2020年Java原创面试题库连载中 【000期】Java最全面试题库思维导图 【020期】JavaSE系列面试题汇总(共18篇) 【028期】JavaWeb系列面试题汇总(共10篇) 【042
java进阶架构师
2020/10/23
1.4K0
Spring Boot 无侵入式 实现API接口统一JSON格式返回
SpringBoot 定义优雅全局统一 Restful API 响应和统一异常处理,太优雅了!
假如你作为项目组长,为 Spring Boot 项目设计一个规范的统一的RESTfulAPI 响应框架。
码哥字节
2024/11/23
4990
SpringBoot 定义优雅全局统一 Restful API 响应和统一异常处理,太优雅了!
springboot之优雅处理返回值
最近项目组有个老项目要进行前后端分离改造,应前端同学的要求,其后端提供的返回值格式需形如
lyb-geek
2022/03/04
8310
SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常。
Java_老男孩
2021/07/20
8.3K2
SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
springboot2之优雅处理返回值
最近项目组有个老项目要进行前后端分离改造,应前端同学的要求,其后端提供的返回值格式需形如
lyb-geek
2020/08/30
1.3K0
springboot2之优雅处理返回值
SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常。
微观技术
2021/08/23
5210
SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
Springboot封装统一返回结果及全局异常处理
很多时候我们在处理业务逻辑的时候需要抛出一些自定义的异常 创建BusinessException.java文件
超级小的大杯柠檬水
2024/11/21
1270
SpringBoot 处理异常的几种常见姿势
这是目前很常用的一种方式,非常推荐。测试代码中用到了 Junit 5,如果你新建项目验证下面的代码的话,记得添加上相关依赖。
Java3y
2019/12/05
7040
猫头鹰的深夜翻译:Spring REST服务异常处理
这篇教程主要专注于如何优雅的处理WEB中的异常。虽然我们可以手动的设置ResponseStatus ,但是还有更加优雅的方式将这部分逻辑隔离开来。Spring提供了整个应用层面的异常处理的抽象,并且只是要求您添加一些注释 - 它会处理其他所有内容。下面是一些代码的示例
眯眯眼的猫头鹰
2019/03/13
8170
SpringBoot - 统一格式封装及高阶全局异常处理
Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常
小小工匠
2022/02/16
1.7K0
SpringBoot - 统一格式封装及高阶全局异常处理
优雅的参数校验与全局异常-代码规范的天生落地
代码规范是项目质量的基石,能够帮助开发者和管理者更好的管理/维护项目、专注于推动快速成长的业务、留出更多时间攻坚重难点系统设计。全局异常+自定义异常+参数校验+统一返回体组合是互联网中Java开发规范、使用代码扫描工具后的提升效率的必然落地方式。
benym
2023/02/14
2.6K0
优雅的参数校验与全局异常-代码规范的天生落地
SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势
虽然 http 的提供了一整套完整、定义明确的状态码,但实际的业务支持中,后端并不总会遵守这套规则,更多的是在返回结果中,加一个 code 字段来自定义业务状态,即便是后端 5xx 了,返回给前端的 http code 依然是 200
一灰灰blog
2020/02/13
5.5K0
Springboot统一返回接口+统一异常处理+后端参数校验
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </
用户5546570
2020/09/17
3.8K0
Springboot统一返回接口+统一异常处理+后端参数校验
Spring | 如何在项目中优雅的处理异常 - 全局异常处理以及自定义异常处理
在快速迭代和持续交付的今天,软件的健壮性、可靠性和用户体验已经成为区别成功与否的关键因素。特别是在Spring框架中,由于其广泛的应用和丰富的功能,如何优雅地处理异常就显得尤为重要。本文旨在探讨在Spring中如何更加高效、准确和优雅地处理异常,帮助开发者更好地构建和维护Spring应用。
kfaino
2023/09/26
4.2K0
Spring | 如何在项目中优雅的处理异常 - 全局异常处理以及自定义异常处理
Java API:封装自定义响应类
本文介绍 Web 服务开发中自定义响应,涵盖标准 HTTP 响应状态码局限性、自定义响应价值、设计原则与实现、在 Spring Boot 项目应用、与其他响应格式对比总结及应用场景。
Yeats_Liao
2025/01/05
2140
Java API:封装自定义响应类
ResponseEntity为单独接口实现灵活返回值控制
Restful API的Web后台服务,一般都提供了统一的接口规范。但是有时候又需要提供回调地址给外部服务,比如微信支付。那么这个回调接口的返回值需要满足微信支付回调的返回值协议(这个协议跟项目的Web后台服务不一致)。 利用ResponseEntity可以单独为某个接口实现返回值的完全控制,也不用修改项目的整体协议规范。 实现 项目的统一返回值协议WebResult /** * @author timxia * @since 2019/8/13 */ @Getter @Setter @ToS
十毛
2019/12/20
1.6K0
ResponseEntity使用
ResponseEntity继承了HttpEntity类,HttpEntity代表一个http请求或者响应实体,其内部有两个成员变量:header及body,代表http请求或响应的header及body,其中的body是泛化的。
用户4396583
2024/07/20
1730
推荐阅读
相关推荐
统一定制API返回格式,我只做了这几件事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档