如何设计出优秀、健壮且易于维护的API——关于HTTP状态码与业务逻辑状态码的处理 - 浪矢

news/2025/10/2 17:26:25/文章来源:https://www.cnblogs.com/CLGYPYJ/p/19123771

目录
  • 反例
  • 正确的处理方法
    • 第1步:在业务逻辑层定义并抛出“业务异常”
    • 第2步:在最外层创建“全局异常处理器”
  • 最佳实践

反例

刚开始学习后端开发时做了一个文件管理系统,其中有一个文件删除的API。
文件和目录删除操作 Delete 接口的设计的很粗糙 :HTTP状态码和业务逻辑状态码都返回给请求方了。
业务逻辑状态码:删除操作执行成功逻辑状态码code=200,删除失败逻辑状态码code=500;文件不存在code=FS4004;无管理权限code=FS4003.
http状态码:只要请求成功就返回200。
这就导致了一个问题,因为我的处理逻辑比较复杂,请求方每次读到http状态码为200就认为删除成功了。
但是我们测试删除操作时,并不存在的文件时也显示http code=200,但我们更想给请求方更多的信息。

正确的处理方法

第1步:在业务逻辑层定义并抛出“业务异常”

当删除操作失败时,不要直接返回一个包含错误码的普通对象,而是抛出一个能描述业务错误的自定义异常。

点击查看代码
// 你的文件删除服务 (FileService.java)
public void deleteFile(String fileId, String userId) {File file = fileRepository.findById(fileId);// 业务场景1:文件不存在if (file == null) {// 抛出业务异常,而不是返回一个错误对象throw new BusinessException("FS4004", "文件不存在");}// 业务场景2:权限不足if (!file.getOwnerId().equals(userId)) {throw new BusinessException("FS4003", "无权删除该文件");}// ... 执行删除操作boolean deleted = doDelete(file);// 业务场景3:未知的内部错误导致删除失败if (!deleted) {throw new BusinessException("SYS5000", "删除操作失败,请联系管理员");}
}

第2步:在最外层创建“全局异常处理器”

在你的 trigger 层(通常是 Spring MVC 中),创建一个全局异常处理器。它的职责就是捕获从业务层抛出的 BusinessException,然后把它“翻译”成标准的 HTTP 响应。

点击查看代码
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(BusinessException.class)public ResponseEntity<ApiResponse> handleBusinessException(BusinessException ex) {ApiResponse responseBody = new ApiResponse(ex.getCode(), ex.getMessage(), null);// 根据业务异常的类型,决定返回哪个HTTP状态码switch (ex.getCode()) {case "FS4004": // 文件不存在return new ResponseEntity<>(responseBody, HttpStatus.NOT_FOUND); // HTTP 404case "FS4003": // 无权限return new ResponseEntity<>(responseBody, HttpStatus.FORBIDDEN); // HTTP 403default: // 其他业务失败,如删除失败return new ResponseEntity<>(responseBody, HttpStatus.INTERNAL_SERVER_ERROR); // HTTP 500}}@ExceptionHandler(Exception.class)public ResponseEntity<ApiResponse> handleGenericException(Exception ex) {// 处理所有未被捕获的未知异常ApiResponse responseBody = new ApiResponse("SYS9999", "系统内部未知错误", null);return new ResponseEntity<>(responseBody, HttpStatus.INTERNAL_SERVER_ERROR); // HTTP 500}}
#### 第3步:Controller 保持简洁 做了以上两步后,Controller 会变得非常干净,它只需要调用业务逻辑,完全不用关心成功失败的判断和响应封装。
点击查看代码
@RestController
public class FileController {@Autowiredprivate FileService fileService;@DeleteMapping("/files/{id}")public ResponseEntity<ApiResponse> deleteFile(@PathVariable String id) {// 只管调用,成功了就往下走,失败了异常处理器会接管fileService.deleteFile(id, getCurrentUserId());// 如果代码能执行到这里,说明没有任何异常,删除成功ApiResponse responseBody = new ApiResponse("200", "删除成功", null);return new ResponseEntity<>(responseBody, HttpStatus.OK); // HTTP 200}
}

这不仅能让自己的代码更易于维护,也能让所有调用你接口的客户端(前端、其他后端服务等)更容易地进行合作开发。

最佳实践

一个优秀的 API 设计,应该让这两者协同工作,而不是混淆它们。
核心流程:

业务层:只关心业务逻辑,当业务失败时,抛出携带业务状态码的自定义异常(如 AppException )。

表现层(全局异常处理器):作为“翻译官”,捕获业务异常,然后将业务状态码映射到一个最贴切的 HTTP 状态码,并构建包含业务状态码的 JSON 响应体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hexo搭建/部署个人博客教程 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

科技公司网站php源码游戏建模培训

持续创作文章&#xff0c;只是为了更好的思考 这里不多介绍了&#xff0c;我放一张图大家就明白是什么接口了。这里只介绍整体加密逻辑&#xff0c;有些细的地方大家自行调整。 本次逆向的网址是 aHR0cHM6Ly90cGFzcy5qaWxpbi5jaGluYXRheC5nb3YuY246ODQ0My8jL2xvZ2luP3JlZGly…

微信网站开发人力资源做网站的好处

今天继续和大家一起来学习初中数学&#xff0c;初一的相关知识&#xff0c;在前面已经介绍了正数和负数&#xff0c;对于有理数也有了清楚的认识&#xff0c;今天我们来学习相反数&#xff0c;相反数的概念和表示是中考命题的热点之一&#xff0c;经常结合其他知识点一起考察&a…

做题记录(Part 1. 基础算法)

P1404 平均数 既然要让子串平均数最大,那就二分平均数,判断能否达到即可。复杂度 \(O(n\log V)\)。 关联题目:[2025国庆集训Day2C] course点击查看代码 signed main(){ read(n), read(m); for(register int i = 1; …

河南艾特网站建设2二级域名免费

定义 树是节点的优先集合度&#xff1a;孩子的数量&#xff0c;度为0 就是终端节点&#xff0c;不为零就是根节点有序树&#xff1a;有顺序&#xff0c;不可以替换无序树&#xff1a;无顺序&#xff0c;可以替换深度 和 树的深度相反&#xff0c;第一层深度为1 树的深度为 3 二…

实用指南:零基础学AI大模型之Prompt提示词工程

实用指南:零基础学AI大模型之Prompt提示词工程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

县城做网站的多么开网上授课的网站应该怎么做

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…

详细介绍:2023 美赛C Predicting Wordle Results(上)

详细介绍:2023 美赛C Predicting Wordle Results(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

Android项目实现自动获取手机号一键登录功能

功能概述 在 Android 应用中实现自动获取本机手机号进行一键登录,同时支持手动登录和历史账号选择功能。这个功能大大提升了用户体验,减少了用户输入成本。 1. 权限配置 首先在 AndroidManifest.xml 中添加必要的权限…

电商网站程序做引流去那些网站好

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种编程技术&#xff0c;使得开发者能够像调用本地函数一样调用位于不同进程、不同主机上的函数或服务。这种技术隐藏了底层网络通信细节&#xff0c;使得分布式系统中的组件能够无缝协作&#xf…

互联网+政务服务平台广告优化

5 月 8 日凌晨消息&#xff0c;微软 Build 2018 开发者大会在今天正式来开帷幕。很明显整场发布会被分为了上下两个部分&#xff0c;上半场如果说是聊一些技术实现和愿景&#xff0c;那下半场就应该说是实战说明了。跨平台云端编程了解下微软在现场展示了 Visual Studio&#x…

深圳 网站 传播自己建设网站模版

【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09;1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

做试客需要去哪些网站比比西旅游网站建设

本文已发表在《程序员》杂志2016年10月期。 如果在使用App时遇到闪退&#xff0c;你可能会选择卸载App、到应用商店怒斥开发者等方式来表达不满。但开发者也同样感到头疼&#xff0c;因为崩溃可能意味着用户流失、营收下滑。为了降低崩溃率&#xff0c;进而提升App质量&#xf…

python必背入门代码天河网站 建设seo信科分公司

定义外键之后&#xff0c;数据库的每次操作都需要去检查外键约束。对于插入来说&#xff0c;影响了插入速度&#xff1b;对于更新来说&#xff0c;级联更新是强阻塞&#xff0c;存在数据库更新风暴&#xff08;Database Update Storm&#xff09;的风险。 所谓 Database Updat…

打造优雅的用户体验:自定义jQuery程序提示插件开发全解析

打造优雅的用户体验:自定义jQuery程序提示插件开发全解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

免费股票API接口全面指南 - 详解

免费股票API接口全面指南 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

广州英铭网站建设北京丰台区做网站公司

一、相关知识 首先我们需要了解传统隐写和生成式隐写的基本过程和区别。传统隐写需要选定一幅封面图像&#xff0c;然后使用某种隐写算法比如LSB、PVD、DCT等对像素进行修改将秘密嵌入到封面图像中得到含密图像&#xff0c;通过信道传输后再利用算法的逆过程提出秘密信息。而生…

Multi-Arith数据集:数学推理评估的关键基准与挑战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做电脑网站用什么软件好用吗企业管理系统作用

随着计算机控制系统在人们生活中的普及,软件自身的可靠性也越来越受到重视.在航空、高铁、核电及军事等高安全要求领域的软件系统——安全关键系统(safety-critical system,简称SCS)更是受到高度的重视.而随着软件系统的复杂度越来越高,软件系统的安全性保证也变得越来越困难.这…

西宁平台网站建设学信网 的企业网站给你做认证

一、镜像基础命令&#xff1a; $ docker info # 查看docker信息 $ docker system df # 查看镜像/容器/数据卷所占的空间。 $ ip addr #查看容器内部网络地址。 $ docker images # 查看镜像 $ docker search 镜像名称 # 搜索镜像 --limit :只列出N个镜像&#xff0c;默认为25个…