你还在统一返回 ApiResult 吗?✋ duck 不必,快来看 API 错误处理的最佳实践 ✔️

你还在统一返回 ApiResult 吗?duck 不必,快来看 API 错误处理的最佳实践 为什么写这篇文章? 相信不少 Java 开发都在项目中使用过类似 ApiResult 这样的对象来包装 Api 返回类型,这相比什么都不包装有一定的好处,但这真的就是最好的做法吗? 其实统一封装 ResultBean 实际上也是一种重复工作,秉承 DRY 的理念,还有必要对其继续优化。 统一返回 ApiResult 还不是最佳实践,必须不断思考优化,就像 React 所提倡的 Rethinking Best Practices 。 ApiResult 现状 我们先看一个常见的 ApiResult 对象,代 阅读详情

为什么写这篇文章?

相信不少 Java 开发都在项目中使用过类似 ApiResult 这样的对象来包装 Api 返回类型,这相比什么都不包装有一定的好处,但这真的就是最好的做法吗?

统一返回 ApiResult 还不是最佳实践,必须不断思考优化,就像 React 所提倡的 Rethinking Best Practices 。

ApiResult 现状

我们先看一个常见的 ApiResult 对象,代码如下:

@Data
public class ApiResult<T> implements Serializable {
    private int code;
    private String message;
    private T data;
} 

好处:客户端可以使用统一的处理方式。

存在的问题:

  1. 在统一返回 ApiResult 的情况下,即使是正常返回,也会带上 code、message 属性,属于冗余。
  2. Controller 层代码存在重复,返回对象重复定义、包装调用编写重复。
public ApiResult<List<Data>> demo() {
    return ApiResult.ok(getList());
} 

当 API 越来越多时,这些存在的问题会被被放大,如何解决这些问题呢?请接着看。

使用 HTTP 状态码

有许多项目采用的方式是,在 API 调用成功时使用正常的数据模型,而在出现错误时,返回相应的 HTTP 错误码 和描述信息。我们看一段 jhipster 中的代码:

@GetMapping("/authors/{id}")
public ResponseEntity<AuthorDTO> getAuthor(@PathVariable Long id) {
    Optional<AuthorDTO> authorDTO = authorService.findOne(id);
    return ResponseUtil.wrapOrNotFound(authorDTO);
} 

主要 HTTP 状态码的含义:

  • 1XX – Informational
  • 2XX – Success
  • 3XX – Redirection
  • 4XX – Client Error
  • 5XX – Server Error

采用 HTTP 状态码就不再需要统一返回 ApiResult ,但问题也随之而来,那就是 ApiResult 中定义的 error code 很难跟 HTTP 错误码一一对应,光有 HTTP 错误码和描述信息是不够的,还需要定义专门

程序员的工资是不是太高了?真相让人心疼 2018互联网冬季其中一个原因是认为劳动力成本太贵???? 今年一场突如其来的寒流袭击了互联网行业,使大爆发了4年之久的互联网行业也迎来了寒冬。很多大公司都在调岗或者裁人。 纵观互联网的寒冬,原因定位很明确,市场也是到了该规范的阶段了。这是所有大爆发后的正常轨迹。大爆发让企业共注重盈利和用户数据,而无暇更多顾及用户感受和用户的真正需求。然而,有的创业公司老板却在失败后抱怨着其中一个原因:劳动力成本太高。还有很多网上吃瓜群众到处说着:程序猿工资高,程序猿跟其他岗位薪资相差太大了。不公平。在这里,博主找到一篇很 阅读详情

相关推荐

SpringBoot应用篇@Value配置自动刷新能力扩展实践

在我们的日常开发中,使用@Value来绑定配置属于非常常见的基础操作,但是这个配置注入是一次性的,简单来说就是配置一旦赋值,则不会再修改; 通常来讲,这个并没有什么问题,基础的 SpringBoot 项目的配置也基本不存在配置变更,如果有使用过 SpringCloudConfig 的小伙伴,会知道@Value可以绑定远程配置,并支持动态刷新 接下来本文将通过一个实例来演示下,如何让@Value注解支持配置刷新;本文将涉及到以下知识点 BeanPostProcessorAdapter + 自定义注解:获取支

Java_cola的博客 2255

后端一次给你10万条数据,如何优雅展示,面试官到底考察我什么?

背景 面试题:后台传给前端十万条数据,你作为前端如何渲染到页面上? 回答者A:我有句话不知当讲不当讲,这什么鬼需求。 回答者B:滚,后端,我不要这样的数据,你就不能分页给我吗。 回答C:10万条数据这怎么展示,展示了也看不完啊。 分析: 面试官既然能这么问,我们从技术的角度出发,探索一下这道题,上手操作了一下: function loadAll(response) { var html = ""; for (var i = 0; i < 100000; i++) {

Java_cola的博客 1493

2020完美解决:调用豆瓣接口错误

目前对豆瓣的API调用需要使用apikey 常用的三种 1、获取正在热映的电影:http://api.douban.com/v2/movie/in_theaters?apikey=0df993c66c0c636e29ecbb5344252a4a 2、获取电影Top250:http://api.douban.com/v2/movie/top250?apikey=0df993c66c0c636e29ecbb5344252a4a 3、获取即将上映电影:http://api.douban.com/v2/m

荒的博客 9131

Spark 大数据环境搭建( Linux 系统安装和配置)

(1)选择典型安装(2)选择“安装程序光盘映像文件(iso)”,点击右侧的浏览按钮, 找到下载好的iso 文件,然后点击下一步。(3)将全名、用户名、密码、确认等几项均设为“spark”, 方便后面使用,然后点击下一步。(4)在命名虚拟机的窗体中,可以设定一下虚拟机名称或直接按默认,然后点击下一步。(5)在指定磁盘容量的窗体中,设定虚拟机使用的最大磁盘大小为60GB,虚拟机文件尺 寸是在使用过程中按需增长的,最大限制为 60GB。

2301_80186825的博客 1607

智能车竞赛循迹控制:基于状态机的直道、弯道、十字路口处理策略

在嵌入式系统与自动控制领域,PID控制算法是实现精确运动控制的基础。其原理是通过比例、积分、微分三个环节的线性组合,对系统误差进行实时校正,从而实现对目标值的快速、稳定跟踪。这项技术的核心价值在于为各类自动控制系统提供了稳定、可靠且易于实现的解决方案,广泛应用于机器人、无人机、工业自动化等场景。在智能车循迹这类特定应用中,赛道环境复杂多变,单一的PID控制器难以应对直道、弯道、十字路口等不同赛道元素的控制需求。此时,有限状态机(FSM)作为一种高效的**决策框架**,能够根据实时感知的赛道特征(如边线曲率、

weixin_34034261的博客 282

华为2022硬件逻辑笔试题

单选题(每题两分) 1.以下关于过程赋值的描述,不正确的是() A在非阻塞性过程赋值中,使用赋值符号“< =” B赋值操作符是“=”的过程赋值是阻塞性过程赋值 C在非阻塞性过程赋值中,对目标的赋值是非阻塞的(因为时延),但可预定在将来某个时间步发生(根据时延:如果是0时延,那么在当前时间步结束) D非阻塞性过程赋值在其后所有语句执行前执行 解:D 2.芯片的功耗和下列哪种不强相关_____________。 A资源利用率 B核电压 C组合逻辑级数 D翻转率 解:A 3.下列说

weixin_44072819的博客 1万+

【FPGA】Robei EDA 的使用(7)—— Robei文件上板试验

#沐朝露兮以自华,觅大道兮以求成 我又滚过来了,研究了20多天RISCV,结果最后因为硬件问题导致无法在比赛中使用RISCV CPU,虽然已经临近比赛后期了,非常的崩溃,但是也没有什么办法。唉,一切不过是从头再来罢了。(写写博客舒缓我心中苦闷) ————————————————进入正文的分割线———————————————— 今天介绍一下如何利用 Robei EDA 生成文件,导入vivado中,综合下载到开发板里。拿我一个PWM控制舵机的代码为例。 Robei EDA设置 假设代码模块(model文件)经

Ninquelote的博客 2565

国宇测试盒GH7009 SPI读操作全解析:从接线到代码实现的避坑指南

本文详细解析了国宇GH7009测试盒进行SPI读操作的完整流程与避坑要点。重点阐述了硬件连接中IO2时序控制引脚的关键作用,提供了从接线方案、电源处理到上位机代码实现的实战指南,并针对常见的数据不稳定、特定寄存器读取失败等问题给出了具体解决方案。

dapp9builder的博客 224

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow)

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow) 包含所有数据和代码,支持一键运行(jupyter)

qq_40999533的博客 1485

Python爬虫实战:利用Playwright与异步技术高效抓取链家十万级二手房数据

在开始编写代码之前,我们首先需要为项目选择合适的技术栈。1. 传统方案:Requests + BeautifulSoup优点: 简单、轻量、学习成本低。直接发送HTTP请求获取HTML,然后解析。缺点: 对于大量由JavaScript动态渲染的内容无能为力。现代网站(包括链家)大量使用JS来加载数据和实现交互,简单的HTTP请求无法获取到完整的页面内容。此外,容易被基于IP或请求头特征的反爬机制拦截。2. 进阶方案:Selenium优点。

2201_76125261的博客 891

PCIE2.0/PCIE3.0/PCIE4.0/PCIE5.0接口的带宽、速率计算

一、PCIE接口速率: 二、PCIE相关概念: 传输速率为每秒传输量GT/s,而不是每秒位数Gbps,因为传输量包括不提供额外吞吐量的开销位; 比如 PCIe 1.x和PCIe 2.x使用8b / 10b编码方案,导致占用了20% (= 2/10)的原始信道带宽。 GT/s —— Giga transation per second (千兆传输/秒),即每一秒内传输的次数。重点在于描述物理层通信协议的速率属性,可以不和链路宽度等关联。 Gbps —— Giga Bits Per Second

技术联盟 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Github标星86k 的Spring Cloud学习教程+实战项目推荐!!上岸蚂蚁金服!!
下一篇: 再见RocketMQ!全新一代消息中间件,带可视化管理,文档贼全!
Python_cola
博客等级 码龄5年 2031粉丝 74原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值