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

news2024/10/7 19:17:42

一下文章内容来自之前做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.coloradmin.cn/o/878226.html

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

相关文章

通过代码实现窗口界面布局的方法

在QWidget窗口中添加相关事件resizeEvent()函数并编写相关功能代码: void Widget::resizeEvent(QResizeEvent *event) {QSize szui->plainTextEdit->size();ui->plainTextEdit->move(5,5);ui->pabpic->move(5,sz.height()5);ui->plainTextEd…

c++游戏小技巧12:输入输出流(存读档超全版)

目录 1.前言 2.输入/输出概念 3.流的概念 4.正文 1.标准I/O流 1.get()函数 2.getline()函数 3.read()函数 4.ignore()函数 5.gcount()函数 6.peek()函数 7.putback()函数 8.istream集合栗子 9.put()函数 10.write()函数 11.ostream集合栗子 2.文件I/O流 1.流…

开机时间分析

一、 开机各个阶段分析 1、Bootloader 阶段 Bootloader 阶段 该阶段分为(preloader 和Ik 阶段) 从按电源键振动到 kernel 开始启动,这部分高通平台暂无好的方法确认时间,可以从总时间推算大概时间。MTK 项目可以从bootprof 确认 2、kernel…

day18 内部类、包、垃圾回收机制

匿名内部类 // Animal a new Animal(){ // Override // public void eat() { // System.out.println("动物在吃饭"); // } // }; abstract class Animal{ public abstract void eat(); }

git 配置网络代理

提高 git 访问 github 速度 网络代理前提: 请开启代理(梯子)检查代理端口(可能会有所不同) 文章目录 1. git 配置参数列表命令:2. git 添加 http 代理3. git 取消 http 代理 1. git 配置参数列表命令: gi…

【AI】《动手学-深度学习-PyTorch版》笔记(十八):卷积神经网络模型

AI学习目录汇总 1、LeNet 1.1 介绍 发布时间:1989年 模型目的:识别手写数字 1.2 网络结构 1.3 定义模型 1.3.1 相关函数原型 1)nn.Conv2d:卷积层 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, paddin

集群、负载均衡集群、高可用集群简介,LVS模式和haproxy/nginx模式拓扑介绍

一.集群的定义 1.定义 2.分类 (1)负载均衡集群 (2)高可用集群 二.使用集群的意义 1.高性价比和性能比 2.高可用性 3.可伸缩性强 4.持久和透明性高 三.常见的两种集群模式拓扑 1.LVS集群模式 2.haproxy/nginx模式 四.常…

Java并发编程(六)线程池[Executor体系]

概述 在处理大量任务时,重复利用线程可以提高程序执行效率,因此线程池应运而生。 它是一种重用线程的机制,可以有效降低内存资源消耗提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行线程池可以帮助我们更好地管理线程的生命周期和资源使用,…

Jmeter-压力测试工具

文章目录 Jmeter快速入门1.1.下载1.2.解压1.3.运行 2.快速入门2.1.设置中文语言2.2.基本用法 Jmeter快速入门 1s内发送大量请求,模拟高QPS,用以测试网站能承受的压力有多大 Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK&#xff0…

DAY2,ARM(特殊功能寄存器,数据操作指令,跳转指令)

1.cmp、sub、b指令的使用; 代码: .text .global _start _start:mov r0,#9mov r1,#15b funfun:cmp r0,r1beq stopsubcc r1,r1,r0subhi r0,r0,r1b funstop:b stop .end结果: 2.汇编指令计算1~100之间和; 代码: .text …

echart 词云图

const graphOut ref(null); const optionGraph reactive({series: [{type: graph,shape: circle,symbolSize: [215, 50],//散点形状设置symbol: circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, arrow’symbol: rect,layout: force,force: {repulsio…

Docker安装elasticsearch分布式搜索

文章目录 ☀️安装elasticsearch☀️1.部署单点es🌸1.1.创建网络🌸1.2.下载镜像🌸1.3.运行 ☀️2.部署kibana🌸2.1.部署🌸2.2.DevTools ☀️3.安装IK分词器🌸3.1.在线安装ik插件(较慢&#xff0…

逗号操作符

逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 运用:

【字典学习+稀疏编码Sparse Encoding】简单介绍与sklearn的实现方式

文章目录 1、字典学习与稀疏编码2、sklearn的实现3、示例 1、字典学习与稀疏编码 简单来说,稀疏编码就是把输入向量(信号)/ 矩阵(图像)表示为稀疏的系数向量和一组超完备基向量(字典)的线性组合…

BeanFactory与Applicationcontext(1)

BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。BeanFactory是spring的“心脏”,核心容器,它也是Applicationcontext的父接口。 BeanFactory实质上并未提供过多的方法,spring容器的I…

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析

Spring之AnnotationConfigApplicationContext源码分析 源码分析 源码分析 以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig02.class); LifeCycleBe…

通达信接口调用过程需要借助什么?

通达信接口是一种用于获取、传输和处理股票市场相关数据的软件接口,以提供了一种连接股票市场数据源和数据使用者之间的通道,允许开发者通过编程方式获取股票行情数据、交易数据和相关信息等。如果调用通达信接口,需要借助以下几个方面的工具…

9-AJAX-1入门

AJAX 目录 AJAX 概念和 axios 使用认识 URLURL 查询参数常用请求方法和数据提交HTTP协议-报文接口文档案例 - 用户登录form-serialize 插件 01.AJAX 概念和 axios 使用 目标 了解 AJAX 概念并掌握 axios 库基本使用 讲解 什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest…

前后端分离------后端创建笔记(06)新增接口页面布局

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

[PyTorch][chapter 50][创建自己的数据集 2]

前言: 这里主要针对图像数据进行预处理.定义了一个 class Pokemon(Dataset) 类,实现 图像数据集加载,划分的基本方法. 目录: 整体框架 __init__ load_images save_csv divide_data __len__ denormalize __g…