rest - 如何在 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 中,直到有一天只需要更改它?
解决方案
如何在 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
吗?什么是正确的缓存失效语义?
推荐阅读
- google-chrome - Safari 是否正确处理临时重定向 (307) 到不同域?
- python - 不和谐机器人不回答关键词
- ios - 在所有内容之上显示一个 UIAlertController 并保持在顶部,即使推送另一个视图(iOS 13)
- c# - 如何在 C# 中检索 NTFS 文件属性
- python - 为什么它不打印高达 1000 的 Armstrong 数字?
- c# - C# Rest API File upload
- assembly - MASM 偏移量与用于寻址的标签
- javascript - 在 React Native 项目中出现 3 个错误 1:React Native CLI 错误 2:Android 开发环境错误 3:模拟器错误
- c# - ASP.NET Core - 在重负载下生成“000000 ...”sha256 哈希
- php - PHP Symfony 试图从命名空间“Sonata\IntlBundle”加载类“SonataIntlBundle”