RESTful API(Representational State Transfer,表述性状态转移)是一种基于 HTTP 协议的 API 设计风格,已经成为了 Web 开发的标准之一。然而随着业务的不断发展,API 的版本管理变得越来越重要,因为如果没有版本化设计,一旦需要修改 API,就会影响到现有的客户端应用,进而导致系统不可用或者数据不一致等问题。针对这个问题,我们可以通过版本化设计来解决。
为什么需要版本化设计
在 Web 开发中,API 是服务端向外提供数据和业务逻辑的入口,而客户端则是调用 API 来实现其对应的功能。随着业务的不断发展和需求的不断增加,API 的增删改是不可避免的,特别是涉及到不可兼容的改变时,比如修改接口签名、修改接口返回值等。如果这些改变是在不考虑版本化的情况下进行的,就会出现以下几个问题:
旧客户端应用会因为调用的 API 发生变化而出现请求失败或者解析错误等问题。
API 接口的变化可能导致现有的客户端应用功能不可用,从而影响业务。
在没有版本化设计的情况下,无法同时支持多个客户端应用的不同版本,因为同一 API 接口只能有一个实现。
针对以上问题,可以通过 API 版本化来解决,下面将会介绍 RESTful API 的版本化设计的具体实现过程。
API 版本的命名方式
一般来讲,API 版本号的命名遵循以下格式:主版本号.子版本号
其中主版本号(Major Version Number)是一个非负整数,表示 API 的大版本更新。主版本号的变化表示 API 的变化非常大,旧版本的 API 已经被淘汰,客户端必须升级到新版本的 API 才能继续使用。
子版本号(Minor Version Number)也是一个非负整数,表示 API 的小版本更新。子版本号的变化表示 API 的变化较小,新版本的 API 与旧版本的 API 可以兼容,客户端可以选择升级或者保持不变。
比如我们定义了 2 个版本的 API,第一个版本是 1.0,第二个版本是 1.1。
版本化设计步骤
- 设计 API,对于每一个 API 接口,可以定义一个唯一的标识符,譬如一个图片 API 接口可以定义如下:
GET /api/v1.0/pictures // 获取图片列表
这个接口的标识符是 /api/v1.0/pictures,其中 v1.0 即是主版本号和子版本号。
- API 接口发送变化,比如需要修改图片 API 接口签名,可以将该接口修改为:
GET /api/v1.1/pictures // 获取图片列表
可以看到,主版本号保持不变,子版本号从 1 变成了 1.1。
- 支持旧版本的 API,因为不同的客户端应用有时候需要使用不同版本的 API,可以通过以下方式来支持旧版本的 API:
- 在上线新版本 API 的同时,同步维护旧版本的 API。
- 如果需要修改旧版本 API,可以在原有的基础上新增一个版本。
- 强制客户端升级,如果某一个主版本的 API 与旧版本 API 不兼容,可以给旧版本客户端应用发出升级通知,强制它们升级到新版本,这样可以避免数据不一致的问题。
版本化设计的指导意义
API 的版本化设计可以避免旧 API 的功能不可用,提高系统的稳定性,同时也能提高客户端的可维护性。由于新版本的 API 与旧版本的 API 兼容,所以客户端应用可以自由选择升级到新版本,这也就给了客户端应用更多自由度和选择。
示例代码
以下是一个简单的 Node.js Express RESTful API 版本化实现示例代码。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- ---- - ----- -- ------ ------ --- -- --- ------------------------ ----- ---- -- - --------------- ------ ----- --- -- ------ ------ --- -- --- ------------------------ ----- ---- -- - --------------- ------ ----- --- ---------------- -- -- - ------------------- --------- -- --------------------------- ---
可以看到,在 Node.js Express 中,我们定义了两个版本的 API,分别是 /api/v1/hello 和 /api/v2/hello,表示 V1 版本和 V2 版本的 API。理论上,客户端可以通过调用对应版本的 API 来获取数据。如果需要升级 API,只需要添加对应版本的路由即可。
结论
RESTful API 的版本化设计是 Web 开发中重要的一环,其设计实现需要注意以下几个方面:
API 版本号的命名方式,一般遵循主版本号和子版本号的方式。
API 接口的设计,需要对每个 API 接口定义一个唯一的标识符。
API 接口的变化,需要修改 API 接口的标识符和版本号。
支持旧版本的 API,需要同步维护旧版本的 API。
强制客户端升级,如果某一个主版本的 API 与旧版本 API 不兼容,可以给旧版本客户端应用发出升级通知,强制它们升级到新版本。
以上是 RESTful API 的版本化设计的详细介绍,希望可以对大家在 Web 开发中的 API 设计提供有效的指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66efd3b06fbf96019730feec