我在API设计中收到的最常见问题之一就是如何对API进行版本控制。虽然并非所有API都完全相同,但我发现在API版本控制方面,某些模式和实践适用于大多数团队。我已经将这些内容收集起来,下面将提供一些关于版本控制策略的建议,该策略将帮助大多数API提供商,无论他们是向内部署API,还是对外的API。

API版本真的那么重要吗?

API是你与API使用者之间建立的纽带。正常情况下,你们之间的纽带不会轻易的断开。纽带包括URI模式,有效负载结构,字段和参数名称,预期行为以及其他内容。这种方法的最大好处是显而易见的:API使用者的理解不会变更,应用程序可以保证持续有效。

但是,永久不变是不现实的。有时因为业务变化,你可能需要对API进行重大改变。发生这种情况时,最好的方式是,你确保不会做任何会导致API使用者修复代码的事情。

打破与不间断的变化

非破坏性变更往往就像是“添加剂”,一般是添加新字段或嵌套资源到资源陈述,又或是增加新的端点,如PUT或PATCH。API使用者从一开始应该构建能够适应这些非破坏性更改的客户端代码。

突破性变化包括:

1.名字段或资源路径,通常在API发布后为了统一命名规范。

2.更改有效负载结构,一般是适应以下内容:

  • a.重命名或删除字段
  • b.将字段从单个值更改为一对多关系(比如从一个帐户的一个电子邮件地址移动到这个帐户的电子邮件地址列表)。
  • c.修改了API的URL,导致返回结果不一致的情况。

简而言之,一旦你将API对外公开发布,你就必须保持它是可用的并且不会影响到使用者的。如果您遇到多个项目,则需要对API进行版本控制,以防止破坏现有的API使用者。

定义API版本策略

任何不断发展变化的API都需要API版本控制策略。你的API版本可以适应根据API使用者的期望而切换不同版本变得有所不同。我通常建议将以下API版本控制策略作为整体API管理系统的一部分。

1.如果你的API处于早期测试版本中,为了获得消费者的反馈,请建立您的API可能会发生变化的正确期望。在此阶段内,你会保留这个版本一段时间,因为你的API设计可能还会更改。作为消费者,API是不稳定的,因此他们应该预期到可能会发生的变化。

2.一旦发布,你的API应被视为契约,如果没有新版本,则不能被替换。

3.不间断的更改会导致次要版本出现问题,客户端会自动迁移到最新版本,不会出现任何负面副作用。

4.突破性的变化意味着客户必须迁移到此新版本,因为它包含一个或多个重大更改。你必须与API使用者建立适当的时间表并定期沟通,以确保他们能方便地迁移到新版本。但在某些情况下,这可能无法马上实现,所以你的团队将会被要求暂时性支持以前的API版本。

何时必须实现API版本控制

一旦确定需要新版本的API,就需要知道如何处理它。实现API版本控制有三种常用方法。

1.资源版本控制

该版本是HTTP请求中Accept标头的一部分,例如,Accept:application/vnd.github.v3+json 发送到GET /customers。这考虑了许多版本控制的首选形式,因为资源在版本化的同时需要保持URI相同。如果未在Accept标头中提供,某些API会选择提供最新版本作为默认版本。

2.URI版本控制

该版本是URI的一部分,作为前缀或后缀,例如,/v1/customers 或/customers/v1。虽然URI版本控制不如基于内容的版本控制那么精确,但它往往是最常见的,因为它适用于不支持自定义标头的各种工具。缺点是资源URI随每个新版本而变化,有些人认为这与拥有永不改变的URI的意图背道而驰。

3.主机名版本控制

该版本是主机名的一部分而不是URI,例如,https://v2.api.myapp.com/customers。当技术限制阻止基于URI或Accept标头到API的正确后端版本时,将使用此方法。

备注:无论您选择哪个选项,API版本都只应包含主要编号。不需要小数字(即  /v1/customers,不是/v1.1/customers)。

实现版本控制的工具

使用工具和技术可以从根本上实现API版本控制过程。用市场上优秀的API编辑器将使技术开发团队能够在更短的时间内生成并切换更多的API版本,从而不断改进设计决策。

结合工具进行版本控制是大多数开发过程的重要组成部分。API设计领域中也有这种能版本控制的工具,实际上,全球范围内API服务领域中已经存在一些优秀的Web API设计工具。

现在,如EOLINKER、RAML、Swagger,都提供了出色的编辑工具来支持他们的语言。EOLINKER采用的是版本对比和重点标注提示,可以清晰的切换、对比。RAML、Swagger采用的是版本切换,方便程度可能略逊一点。而且只有前者是支持中文的,后两种只支持英文语言。这些API编辑器都能轻松地实现API版本的控制,使得更容易在更短的时间内切换运行版本。

附上EOLINKER的官方网址:https://www.eolinker.com

附上Swagger的官方网址:https://swagger.io/

附上RAML的官方网址:https://raml.org/

最后的想法

请记住,API是与你的消费者链接的枢纽。打破旧的连接,就需要新版本。选择策略,制定计划,并与API使用者沟通该计划,这才是版本控制的最终目的。

参考资料:James Higginbotham,When and How Do You Version Your API?

原文地址:https://dzone.com/articles/when-and-how-do-you-version-your-api

对API进行版本控制的重要性和实现方式的更多相关文章

  1. 实现API优先设计的重要性和实现方式

    应用API优先的方法意味着设计API时,使其具有一致性和适应性,无论应用于哪些开发项目.对API使用API​​描述语言(如OpenAPI)是关键,因为它有助于建立API与其他程序通信的枢纽,即使这些系 ...

  2. 从壹开始前后端分离 [.netCore 填坑 ] 三十四║Swagger:API多版本控制,带来的思考

    前言 大家周二好呀,.net core + Vue 这一系列基本就到这里差不多了,今天我又把整个系列的文章下边的全部评论看了一下(我是不是很负责哈哈),提到的问题基本都解决了,还有一些问题,已经在QQ ...

  3. API服务版本控制 Microsoft.AspNetCore.Mvc.Versioning

    我们在进行webapi服务开发时,会遇到一些多个版本的api共存的情况发生,例如某一版本APP上线后,需求发生变更,需要在下一个升级版本更新API,但同时又需要保证这个APP版本能正常使用,这时候就需 ...

  4. api.versioning 版本控制 自动识别最高版本

    Microsoft.AspNetCore.Mvc.Versioning //引入程序集 .net core 下面api的版本控制作用不需要多说,可以查阅https://www.cnblogs.com/ ...

  5. api.versioning 版本控制 自动识别最高版本和多Area但同名Contoller问题解决办法

    Microsoft.AspNetCore.Mvc.Versioning //引入程序集 .net core 下面api的版本控制作用不需要多说,可以查阅https://www.cnblogs.com/ ...

  6. api接口对于客户端的身份认证方式以及安全措施

    转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...

  7. 【百度地图API】如何使用suggestion--下拉列表方式的搜索建议

    原文:[百度地图API]如何使用suggestion--下拉列表方式的搜索建议 摘要: 百度地图上有一个很强大的搜索建议功能,以下拉列表的方式展示出来.比如,输入“百度”,下拉列表中就会出现“北京市海 ...

  8. ASP.NET Web API编程——版本控制

    版本控制   版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...

  9. .Net Core Api 使用版本控制

    1,安装Microsoft.AspNetCore.Mvc.Versioning NET Core Mvc中,微软官方提供了一个可用的Api版本控制库Microsoft.AspNetCore.Mvc.V ...

随机推荐

  1. Linux运维工程师学习成长路线

    不过大家的留言都很精彩,希望大家也可以去留言区逛一逛~~ 好在这不是最后一期送书,之前已经有了好多活动,小编一定继续为大家多送些福利. 希望大家可以一如既往的关注脚本之家,支持爱你们的小编,共同进步! ...

  2. Redis持久化深入理解

    用过Redis的都知道,Redis有两种持久化方式:RDB和AOF,他们的区别大家应该都清楚,所以今天主要想分享一下这两种持久化方式的底层原理以及实现. 如果让你手写一个持久化(架构级)的功能,你没有 ...

  3. linux c库函数大全

    Linux C函数库参考手册  [转自ChinaUnix]第1章字符测试函数isalnum(测试字符是否为英文字母或数字)isalpha(测试字符是否为英文字母)isascii(测试字符是否为ASCI ...

  4. HDU 1025:Constructing Roads In JGShining's Kingdom(LIS+二分优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Problem Des ...

  5. 字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

    关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多.至于选择哪一种字符串匹 ...

  6. STL库的应用

    容器分为两类:序列式容器和关联式容器. 序列式容器,其中的元素不一定有序,但都可以被排序.如:vector.list.deque.stack.queue.heap.priority_queue.sli ...

  7. 嵊州D3T1 山魔 烙饼问题

    嵊州D3T1 山魔 有n 座山,每座山有南北两面. 每一天,一些山的某一面(不一定相同) 会受到山魔的袭击. 但是山魔一天最多只会袭击k座山. 当每座山的每一面都被袭击过后,山魔就会离开. 那么至少要 ...

  8. Java编程思想:进程控制

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  9. Jenkins+Sonar搭建持续集成和代码质量检查环境

    Jenkins+Sonar搭建 一.相关环境及下载地址 系统:Ubuntu JDK:1.8 MySQL:5.7 软件包: jenkins_2.121.3_all.deb sonarqube-7.3.z ...

  10. 个人永久性免费-Excel催化剂功能第68波-父子结构表转换之父子关系BOM表拆分篇

    Excel中制造业行业中,有一个非常刚需的需求是对BOM(成品物料清单)的拆解,一般系统导出的BOM表,是经过压缩处理的,由父子表结构的方式存储数据.对某些有能力使用SAP等专业ERP软件的工厂来说, ...