首页 > 解决方案 > 如何在 REST API URI 地址中进行版本控制?

问题描述

我正在寻找对 Spring REST API 的 URI 进行版本控制的方法,因为在启动新应用程序的情况下,REST API 会处理新应用程序并在一段时间内支持旧应用程序请求。但是,每当将版本添加到 URI 时,我通常怀疑什么数据库、系统实体和 URI。

例子:

无版本,请求获取所有用户:

http://host:8080/api/users

使用版本控制:

http://host:8080/v1/users

http://host:8080/v2/users

http://host:8080/v1/products

我正在考虑制作一个用户实体,在定义属性时,我注意到它们不是强制性的,并且实体始终是最新版本。对于 URI 的“v2”版本,我创建了一个 UserV2DTO,以便它主要服务于使用所需注释进行验证的用户实体。对于 URI 的“v1”版本,假设用户没有“dateBirth”属性,这样它会收到一个没有 dateBirth 属性的 UserV1DTO,并且在将 DTO 转换为实体时,实体.dateBirth 属性为空,因为它是必需的。

我想知道这是否是一种正确的版本控制形式,因为在数据库中属性不是强制性的,并且强制性的验证在 DTO 中?另外我想知道是否所有资源的所有 URI 都需要更改为最新版本,或者在“产品”的情况下,它是否可以保留在 V1 中,直到有一天只需要更改它?

标签: restspring-bootjpa

解决方案


如何在 REST API URI 地址中进行版本控制?

真实答案?任何你想要的方式,都符合你当地的惯例。

在 REST 中,URI 只是标识符;实际上,它们是用于在缓存中查找信息的键。在 URI 中嵌入信息是由服务器自行决定的,并且仅供其自己使用。

Roy Fielding在领导HTTP/1.1规范工作的同时定义了 REST,他写道

制作真正的 REST API 的原因是为了获得可进化性……“v1”是 API 客户的中指,表示 RPC/HTTP(不是 REST)

举个例子,考虑一下谷歌——你认为他们多年来有多少种不同的网络搜索实现?但是 API 本身是稳定的:导航到带有书签的主页,在搜索表单中输入数据,提交——将数据分派到表单元数据中描述的任何 URI。

当然,即使您不使用 REST,您可能仍然需要一个合理的 URI 设计。使用路径段来划分资源层次结构在相对 URI方面具有优势,因为您可以使用点段在层次结构中生成其他标识符。

/v1/users + ../products -> /v1/products

如果您清楚自己是否真的在每个版本中都有新资源,或者具有不同表示的共享资源,那么以后的生活可能会容易得多。如果有人改变/v2/users了,那也应该改变/v1/users吗?什么是正确的缓存失效语义?


推荐阅读