接口变更常见的八种场景,一定要考虑兼容性!

news/2024/11/29 16:30:35/文章来源:https://www.cnblogs.com/beatle-go/p/18576341

1. 接口新增入参字段,并且有校验逻辑
在日常开发中,经常会遇到的需求就是,在老的接口上,新增入参,并且需要校验。

这时候兼容性如何处理呢?我举个简单点的例子:

比如一个用户注册接口,突然加一个email的字段并且不能为空,且要校验是否符合邮箱格式

其实可以升级API版本,比如创建一个新的API版本,比如/v2/api/register,在这个新版本中包含email字段,并对其进行非空校验。

如果觉得每次新增个字段和简单校验这种情况,都要升级版本号,比较复杂繁琐,则可以将新字段email设置为可选。

如果客户端传了email字段,就对它校验,不传的话,直接放过,然后可以打印一下日志。

if (StringUtils.isNotBlank(userRequest.getEmail())) {checkEmail(userRequest.getEmail());
}else {log.info("old system request,email is null,request:{}", userRequest);
}

为什么要这么做呢?

举例,如果修改了接口后,还是有老的请求,不带email字段过来,站在业务角度,就是可以正常注册,如果直接校验拦截,那就有问题~~~

2. 接口错误码调整
有时可能需要对接口的错误码进行调整。如果调整了错误码,要及时更新接口文档,并通知上下游。说明错误码调整的原因。并且要做兼容性联调测试。

比如分布式锁获取失败的错误码,一开始是423000,上游依赖这个错误码来重试的。后来做分布式锁升级优化的时候,反手把它修改为666000了。如果不通知上下游,联调测试啥的,偷偷改就不管了。那后面肯定出问题,因为上游获取锁失败,没得重试了,依赖的错误码变更了。。。

3. 接口返回值调整了
其是不管是错误码调整还是返回值调整,都是有共性的。

要按照三步曲去走:

  • 更新文档,说明修改了哪些内容
  • 通知上下游,说明原因,场景
  • 兼容性联调测试

比如接口不是联机交易,而是MQ交互的。

假如作为MQ的生产者,原来的消息体有个json格式的报文,然后在本次需求调整了内容。不及时做好这3步,消费端可能因为发版本后,消费不了这个报文(比如解析不了某个特殊返回值)。

4. 接口参数新增、或者修改了校验
如果接口,原来有个字段,比如一开始最大长度是10,然后后来产品需求优化,可以增加到20。然后觉得这个需求很简单,开开心心,花十分钟改完了,把入参校验扩大位数,把数据库的字段长度修改。

后来上线的时候,下游文件核对系统跑失败了。。。因为也会对这个字段进行最大长度是10的校验。

所以做这类型需求的时候,要修改参数校验逻辑的时候。一定要考虑:兼容性。上下游是否会有影响等等。

5. 接口删除,真的没请求访问了吗
有些时候,如果发现代码没引用,就会删掉。如果是对外接口的话,不能随手就删掉,要确认是否还有调用。

删除一个对外接口,要做这几件事:

  • 跟上游确认,是否还有调用
  • 查看监控,日志确认最近一年或者说一个月是否还有调用
  • 跟产品对齐
  • 说明接口作用,为什么要删除,是否影响等等

6. 接口内部,抽取公用方法,要考虑兼容性
在抽取公用方法的时候,要考虑兼容性,不能破坏原来的逻辑。

假设有一个订单处理系统,该系统支持多种支付方式(如信用卡支付、支付宝支付等)。每个支付方式有自己的处理逻辑,但现在需要添加日志记录和异常处理,并确保这些修改不会破坏现有的支付方式。

public class OrderProcessor {   public void processCreditCardPayment(Order order) {
   // 信用卡支付逻辑System.out.println("Processing credit card payment for order: " + order.getId());
   // 假设这里有复杂的支付逻辑
   }   public void processAlipayPayment(Order order) {
   // 支付宝支付逻辑System.out.println("Processing Alipay payment for order: " + order.getId());
   // 假设这里有复杂的支付逻辑
   }
}

可以抽取一个公用方法来处理日志记录和异常处理,同时保持每种支付方式的特定逻辑不变。

public class OrderProcessor {// 公用方法,处理日志记录和异常private void processPaymentWithLoggingAndExceptionHandling(Order order, Runnable paymentAction) {try {// 记录日志System.out.println("Starting payment process for order: " + order.getId());// 执行支付逻辑
            paymentAction.run();// 记录支付成功日志System.out.println("Payment for order " + order.getId() + " was successful.");} catch (Exception e) {// 记录支付失败日志System.err.println("Payment for order " + order.getId() + " failed: " + e.getMessage());// 这里可以添加更多的错误处理逻辑,如重试机制或通知相关人员
        }}public void processCreditCardPayment(Order order) {processPaymentWithLoggingAndExceptionHandling(order, () -> {// 信用卡支付逻辑System.out.println("Processing credit card payment for order: " + order.getId());// 假设这里有复杂的支付逻辑
        });}public void processAlipayPayment(Order order) {processPaymentWithLoggingAndExceptionHandling(order, () -> {// 支付宝支付逻辑System.out.println("Processing Alipay payment for order: " + order.getId());// 假设这里有复杂的支付逻辑
        });}
}

简单点描述,抽取公用方法是好事,但是不能为了公用用法,而去动到原来的逻辑,一定要做好兼容性测试。
以前一位同事,抽了一个公用方法,本来有A和B两个url入口,调用进来的,然后抽了公用方法,测试也只是校验了B方法,因为B才是本次需求改动,但是因为抽公用方法,影响了A接口导致出问题。
7. 接口新增入参、出参
平时做需求时,这个太常见了。新增入参字段,或者新增字段返回。入参、出参新增,这里还是做好三步曲:

  • 更新文档,说明修改了哪些内容
  • 通知上下游,说明原因,场景
  • 分析兼容性影响,联调测试

8. 修改老接口时,思考接口的兼容性
很多bug都是因为修改了对外老接口,但是却不做兼容导致的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。
所以,如果需求是在原来接口上修改,尤其这个接口是对外提供服务的话,一定要考虑接口兼容。举个例子吧,比如dubbo接口,原本是只接收A,B参数,现在加了一个参数C,就可以考虑这样处理。

//老接口
void oldService(A,B);{
//兼容新接口,传个null代替C
newService(A,B,null);
}//新接口,暂时不能删掉老接口,需要做兼容。
void newService(A,B,C);

总结:

  • 更新文档,说明修改了哪些内容
  • 通知上下游,说明原因,场景
  • 分析兼容性影响,联调测试

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

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

相关文章

20222411 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1 实践内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式、该域名对应IP地址、IP地址注册人及联系方式、IP地址所在国家、城市和具体地理位置 PS:使用whois、dig、nslookup、traceroute、以及…

如何通过精准管理,推动产品按时交付

作为产品经理,项目管理是一项必须具备的核心能力。无论是从产品规划、开发到最终交付,项目管理贯穿了整个产品生命周期,涉及团队协调、进度控制、资源分配、质量保障等多个方面。有效的项目管理不仅能帮助团队按时交付高质量的产品,还能提升效率、降低成本并确保客户满意。…

js和CSS3媒体查询制作简单的响应式导航菜单

这是一款使用纯js和css3媒体查询制作的简单的响应式导航菜单效果。该导航菜单类似bootstrap导航菜单,它通过media query制作760像素断点,当视口小于760像素时,菜单会收缩为隐藏的汉堡包菜单。在线演示 下载使用方法HTML结构 该导航菜单使用<nav>元素最为包裹容器,di…

hhdb数据库介绍(10-4)

实例管理 该功能用来查看和管理所有计算节点集群中存储节点所在实例的主从关系。实例信息可以通过主机名、端口号、和存储节点版本号进行筛选。 实例管理信息 功能入口: 登录管理用户界面->实例管理实例管理信息以一个存储节点为单位显示一条记录,可对具体的存储节点进行“…

PE文件结构解析 Part3 NT Headers

文章来源:https://0xrick.github.io/win-internals/pe4/ 目录简介NT Headers(IMAGE_NT_HEADERS)签名 SignatureFile Header(IMAGE_FILE_HEADER)Optional Header (IMAGE_OPTIONAL_HEADER)总结 简介 在前面的文章中,我们看过了DOS Header的结构以及逆向了DOS stub。 这篇文章我…

人员背夹佩戴识别智慧矿山一体机斜井人员进出识别:安防设备时间显示错乱原因及具体解决办法

在现代矿山行业中,安全和效率是两个核心议题。随着智能化技术的不断进步,智慧矿山的概念逐渐成为现实,特别是在非煤矿山的管理与运营中,智能化手段的应用已经成为提升安全性、效率和经济性的关键。本文将深入探讨人员背夹佩戴识别智慧矿山一体机在配电室无人巡检识别算法中…

windows下python批量更新软件包

前言 相信很多小伙伴都遇到过python有些软件包版本过低导致无法安装一些模块的问题,刚好我前两天也遇到了,这里写个文章记录一下 一、更新pip版本 打开命令控制面板,输入: python -m pip install --upgrade pip二、查看过期的软件包 pip list可以看到有很多已经过期的包也可…

配电室长期无人巡检识别智慧矿山一体机非煤矿山算法:配电室监控与安全管理

随着科技的进步和智能化技术的迅速发展,矿山行业正在经历一场深刻的变革。智慧矿山的概念应运而生,尤其是非煤矿山的管理与运营中,利用智能化手段提升安全性、效率和经济性已成为热门趋势。长期无人巡检作为智能矿山运营的重要组成部分,其应用不仅降低人力成本,还能实时监…

Web小案例

web小案例web小案例 HTML + CSS3dTab<style> *{margin: 0;padding: 0;box-sizing: border-box;font-family: Oswald, sans-serif; } body {display: flex;justify-content: center;align-items: center;height: 100vh;background: #434750; } ul {position: relative;/*整…

电脑桌面好用便签软件有哪些推荐

打工人在电脑桌面上使用一款好用的便签软件,不仅可以随手记录工作信息,还可以高效管理待办事项,让工作事半功倍! 下面一起来看四款电脑桌面好用的便签软件吧! 一、Win 系统自带便笺 优点: 操作简单,系统自带,直接搜索就能打开,创建、编辑便签都非常容易,新手也能快速…

安装cuda

(1)介绍CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA GPU(图形处理器)的强大计算能力进行通用计算,而不仅仅局限于图形渲染。eg:大量的矩阵运算等计算密集型任务CUDA 提供了一套完整的开发工具,包括…

PbootCMS缩略图上传图片被截取变模糊的解决方法

在使用PbootCMS设置缩略图的时候,发现被自动截取了,缩略图没匹配到后台,而是在程序里设置的。具体方法:打开/config/config.php文件,在第40行// 缩略图配置 ico => array(max_width => 2000,max_height => 1000 ), 此两个参数为最大宽度和最大高度,max_height为空…