API 接口设计版本管理控制的规范:向后兼容的3个规则

news/2024/12/5 9:43:05/

一下文章内容来自之前做API接口时整理的一些内容,记录分享一下。

在HTTP和HTML发展的早期,有着这样一条规则:任何浏览器在遇到无法识别的元素或元素属性时,都应该像该标签不存在一样行事。这使得快速更新HTML的功能成为可能,而不会增加HTML客户端应用程序(浏览器)的 "可破坏性"。(注:参见Bert Bos 2001年关于"W3C、XML和标准化"的演讲,以了解早期HTTP/HTML设计的一些情况。)

所有类似例子都可以追溯到指导大多数互联网标准本身创建的一个基本规则。Jon Postel在1980年提出的"稳健性原则":

"在你所做的事情上要保守,在你接受别人的东西上要自由"。

正确管理API的长期变化的第一条规则是不要把破坏性的变化提交给生产。原因很简单:一旦你发布了你的API,人们开始使用它,这个界面就是一个承诺。而打破这一承诺可能意味着失去客户。正如亚马逊的Werner Vogels所说的那样:"API是永远的"。他在2016年的一篇博文中说、 

"[在亚马逊] 我们知道,设计API是一项非常重要的任务,因为我们只有一次机会来做好它。"

 

API接口向后兼容的3个规则

有一些简单的实施规则,你可以用来减少在你的API生态系统中引入破坏性变化的可能性。如果你想长期成功地管理API,将这些作为你的API设计和审查实践的一部分是非常重要的。

规则一:不要拿走任何东西。

第一条规则是,一旦你发布了一个API,你就不能从它那里拿走东西。不能拿走一个承诺的URL,一个输入参数,或一个输出数据点。即使你在文档中告诉 开发者你的API的某些元素可能会消失或改变,你仍然不能这样做。因为,嗯,开发人员。

这第一条规则的真相在被称为 "海勒姆法则"或 "隐性依赖法则 "的东西中得到了解释:

"如果有足够数量的API用户,你在合同中承诺什么并不重要: 你的系统的所有可观察到的行为都会被某人所依赖。"- Hyrum Wright,谷歌的员工软件工程师。

这也适用于枚举值。如果你有一个名为status的字段,并记录了它有五个可能的值,你就不能在以后发布API的更新时,status只有四个可能的值。

规则二:不要改变任何东西的含义。

第二条规则指出,你不能改变你的API中现有元素的含义。如果你承诺过滤器语句中的count参数是指 "用户数",那么你以后就不能把同一个参数改为 "页面数"。

改变事物的含义与拿走它并以其他东西取代它的效果相同。那是一种破坏性的改变,也是你对API的希波克拉底誓言的放弃。

规则三:所有的新增功能都是可选的。

第三条规则是,任何新的功能(URL、输入参数和输出参数)都必须被视为可选。如果你的addCustomer操作在最初的版本中采取了四个必要的参数,你就不能增加一个新的、第五个必要的参数。同样,这实质上是拿走了旧的addCustomer方法,而用一个非向后兼容的addCustomer版本来代替它。

当然,在有些情况下,你别无选择,只能引入一个突破性的变化。也许你的团队搞砸了,API泄露了个人身份信息,或者一些法规发生了变化,你不再被允许接受或分享数据,等等。当这种情况发生时,是时候拿出你的分叉了。因为一个API的新 "版本 "实际上只是一个致命的分叉(用软件术语说)。

分叉是软件工程中一个相当著名的术语。它可以追溯到20世纪80年代初通过Usenet的在线讨论,指的是在一个项目的主干上创建一个分支。当时的假设是,一旦你从你的分叉处分支,你就不会再期望合并到主干上了。虽然我们今天在软件工程中经常使用主干、分支和合并,但API往往会随着时间的推移而 "保持分叉",很少再合并到一起。

如果你知道你需要引入一个突破性的变化,分叉你的API并在一个新的URL空间中发布它。如果你愿意,可以称之为 "版本"。但你仍然不是詹姆斯-邦德,所以要注意,发布新版本并不意味着你可以杀死旧版本。相反,你需要将它们并排运行一段时间。这就避免了我们前面提到的整个 "中指 "的情况。

有了并排的API,API消费者可以继续使用他们当前的API版本,直到他们准备好在未来的某个时间点进行升级--这是他们自己的时间表,而不是你的。

Salesforce是一家非常了解如何分叉API以获得乐趣和利润的公司。他们有一个习惯,每年发布三次新版API。他们2021年春季的API是51版。我最后一次检查显示,他们支持所有以前的版本,可以追溯到2014年春季(也就是v30!)。是的,Salesforce支持20个过去的版本,并排在一起。

开源冠军Eric S. Raymond将 "分叉 "与悲惨或代价高昂的事件联系起来。创建软件分叉通常表明存在无法解决的分裂,并意味着大量的重复工作。而且,正如我们在Salesforce模式中看到的那样,在API领域也是如此。

如果你致力于发布突破性的变化,你也需要致力于并排发布、文档、在线支持,等等。

image-20210702094009859

 


http://www.ppmy.cn/news/1032085.html

相关文章

人流目标跟踪pyqt界面_v5_deepsort

直接上效果图 代码仓库和视频演示b站视频006期: 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示: YOLOv5 DeepSORT介绍 YOLOv5 DeepSORT是一个结合了YOLOv5和DeepSORT算法的目标检测与多目标跟踪系统。让我为您详细解释一…

【boost网络库从青铜到王者】第二篇:asio网络编程中的socket的监听和连接

文章目录 1、网络编程基本流程2、终端节点endpoint的创建2.1、客户端终端节点endpoint的创建2.2、服务器终端节点endpoint的创建 3、服务器与客户端通信套接字socket的创建4、服务器监听套接字socket的创建5、绑定accpet监听套接字6、客户端连接指定的端点7、服务器接收连接8、…

【Spring】纯注解开发

1、简介 在Spring3.0升级了纯注解开发模式,使用Java类来代替配置文件,开启了Spring快速开发赛道。 2、定义bean Component Service Controller Repository 3、纯注解开发 使用Configuration声明一个配置类,使用ComponentScan来扫描作为bea…

基于协同过滤算法的体育商城商品推荐系统_t81xg

相比于传统的体育商品推荐方式,个性化智能的管理方式可以大幅提高体育商品推荐的管理效率,实现了个性化智能体育商品推荐的标准化、制度化、程序化的管理,有效地防止了体育商品推荐的随意管理,提高了信息的处理速度和精确度&#…

嵌入式要卷成下一个Java了吗?

不会! 说不会也是有自己的原因的 前几天写了一篇 Linux 和单片机的文章 不做Linux就没前途吗? 单片机容易,门槛低,无非不就是单片机技术知识点比较少,特别是面向过程式的编程也更容易掌握。嵌入式 Linux 是多任务式的&…

构建 LVS-DR 群集、配置nginx负载均衡。

目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、准备四台虚拟机 2、配置负载调度器(192.168.2.130) 3、部署共享存储(192.168.2.133) 4、配置两个Web服务器(192.168.2.131、192.168.2.132) 测试集群 二…

适用于物联网 (IoT)的远距离、低功耗、低速率WiFi—Wi-Fi HaLow

1. Wi-Fi 简介 Wi-Fi(Wireless Fidelity)是目前较为常见的无线通信方式,承载着一半以上的互联网流量。Wi-Fi是一个总称,涵盖了802.11通信协议系列,由Wi-Fi联盟持有并推动其发展。802.11通信协议发展至今已逾二十年&am…

【新品发布】ChatWork企业知识库系统源码

系统简介 基于前后端分离架构以及Vue3、uni-app、ThinkPHP6.x、PostgreSQL、pgvector技术栈开发,包含PC端、H5端。 ChatWork支持问答式和文档式知识库,能够导入txt、doc、docx、pdf、md等多种格式文档。 导入数据完成向量化训练后,用户提问…