如何支持不同的API版本


15

我正在编写Rest API,并且想知道如何最好地处理对不同版本的支持。这样,我不是要如何将URI定义为V2或V3,而是要根据需要构造代码:

  • 同时支持多个版本,例如。V1&V2&V3 URI必须同时存在。当说V4来限制任何时候的支持量时,我将退出V1。
  • 避免尽可能多的代码重复
  • 轻松向一个版本添加不间断的更改,而不会影响其他版本

似乎可以采取的方法很少:

  • 使用Git来控制版本,并为不同的版本提供分支(旧版本基本上不需要进行新的开发工作)。这将意味着没有代码重复,因为代码中只有最新版本,但是以前的版本将需要与DB的新版本一起使用,直到淘汰。

  • 复制代码,以便每个版本都在同一应用程序中处理,并且具有完全独立的代码路径,但这将意味着大量重复

  • 在各个版本中重复使用大量代码,但这将使维护变得困难,因为更改一个版本更可能影响先前版本

所有选项似乎都有自己的问题,是否有最佳实践来解决此问题?


1
如果您在URL中指定版本号(例如myserver / api / 3.1.4 / user / get),则可以将版本号传递到您调用的任何函数中,以便可以本地化特定于版本的行为而无需共享太多代码。
James McLeod 2014年

Answers:


5

做这个:

在各个版本中重复使用大量代码,但这将使维护变得困难,因为更改一个版本更可能影响先前版本

但不要破坏以前的版本。

您应该进行测试以验证所有受支持的版本均正常运行。如果没有这些测试,则应首先创建它们以涵盖您要更改的任何代码。


2

结合使用GIT版本分支(或将每个版本分叉到单独的存储库中)来支持和维护旧的API版本,并可能有一些可重用的代码可以共享为依赖项(例如通用库),例如去。因此,每个API版本都是一个可单独部署的工件。这提供了灵活性,例如,API V1可以依赖于公共V1,而API V2,V3,V4可以依赖于公共V2。从开发的角度来看,这将是最简单,最简洁的方法,因为您的代码库不会与每个新版本相乘,而是每个版本都被隔离到其自己的项目/代码库中,而仅与自身相关。

部署单独工件的另一个原因是,可能存在诸如安全机制之类的交叉问题,或者诸如依赖项注入框架之类的框架/库,它们可能会在较新版本的API中进行更改,并且如果支持较旧的API,则会造成很多困难所有这些都位于同一代码库中(如果是Java,则在运行时使用Classloader)。

每种方法,无论是每个版本的分支还是完整的重复代码库,总是会遇到需要更改公共集成点(例如DB或分布式缓存架构)的问题。较旧版本的API可能需要某种维护才能进行这些更改,或者引入其他一些工具(例如数据库视图)来帮助实现兼容性。根据更改的性质,这可能是不可避免的困难。


0

我不知道结果与您的API版本有何不同,但是您可能会在中间拥有一个兼容性层,该兼容性层可以在版本之间进行切换并填补空白或转换数据。

话虽这么说-通常永远不会一对一地解决-因此开关或状态机类型的设计帮助我解决了这个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.