REST API 用于移动 REST 客户端的服务器 - 如何识别应用程序版本?
REST API Server for mobile REST client - How to identify app version?
我们已经为我们的移动客户端 (Android) 开发了 REST API。在服务器端,当用户首次通过我们的应用程序注册时,我们有用户 table。现在我们正在增强我们的功能,它需要修改现有的 API。
问题是我们不知道我们的哪些用户会使用应用程序的更新版本或旧版本。如何解决这个问题?
我们应该在 HTTP header 中从设备发送 App 版本,然后将其存储在我们的数据库中。即使在这种情况下,用户也可以从具有不同应用程序版本的多个设备登录。
是否有解决此问题的推荐方法?
我不确定您是在谈论移动应用程序(REST 客户端)还是您的 URI(REST API)的版本控制。
要对您的 API 进行版本控制很容易,请执行以下操作;
/v1/some-resoure
/v2/some-resource
或者有些人更喜欢向域添加版本控制以保持 URI 更清晰;
v1.api.com/some-resource
v2.api.com/some-resource
对于移动应用程序的版本控制,听起来您的 API 关心正在使用的应用程序版本,对吗?如果是,则这是客户状态。我们需要在 URI 中传递这个状态。所以你可以拥有;
/some-resource?clientVersion=1
/some-resource?clientVersion=2
每个调用现在都会告诉您 API 正在使用哪个版本。不过,我不得不说,这有点奇怪。你不应该像这样将你的 API 与你的客户联系起来。您的 API 不应该关心正在使用什么客户端,更不用说版本了。相反,每个客户端应该只关心它使用的 API 的版本。
如果您的客户端版本 1 依赖于您 API 的响应等中的某些事情是真实的,您需要确保您的 api 版本(见上文) .所以也许您的客户端的版本 1 只调用 /v1....
假设您现在拥有客户端的第 12 版,现在您还想更改 API 的工作方式。您现在必须使用不同的 URI 版本公开资源,例如/v2...
版本 12 现在只调用 /v2...
URI。所有以前版本的客户 (1 - 11) 都不会受到影响,因为他们仍在使用 /v1...
接下来的问题是,您将 API 上的版本保持活动状态多长时间?这是一个标准的版本控制问题。如果您控制 API 和您的客户端,您将知道在停止客户端 (1-11) 之前需要多长时间,然后才能停止 /v1...
URI。
如果您不控制客户端,则需要与客户端的开发人员沟通您将停止使用 /v1...
API 版本控制的第一条规则:不要这样做。采取不同的方法:
- 仅进行向后兼容的更改,例如添加新字段(并避免删除或重命名字段)。
- 如果您必须进行不兼容的更改,则添加新资源并将旧资源留给旧客户。
- 如果由于业务变化太大而需要全部重新做,请添加一个新的 API(通常在第二个子域上)。
- 尝试使用超媒体,因为它将解决一些 问题(当然不是全部)。例如,参见 http://soabits.blogspot.dk/2013/12/selling-benefits-of-hypermedia.html 进行讨论。
Roy Fielding 在 InfoQ 的文章中对此有一个有趣的看法:http://www.infoq.com/articles/roy-fielding-on-versioning。
Mark Nottingham 在这里讲述了一个类似的故事:https://www.mnot.net/blog/2012/07/11/header_versioning。
我们已经为我们的移动客户端 (Android) 开发了 REST API。在服务器端,当用户首次通过我们的应用程序注册时,我们有用户 table。现在我们正在增强我们的功能,它需要修改现有的 API。
问题是我们不知道我们的哪些用户会使用应用程序的更新版本或旧版本。如何解决这个问题?
我们应该在 HTTP header 中从设备发送 App 版本,然后将其存储在我们的数据库中。即使在这种情况下,用户也可以从具有不同应用程序版本的多个设备登录。
是否有解决此问题的推荐方法?
我不确定您是在谈论移动应用程序(REST 客户端)还是您的 URI(REST API)的版本控制。
要对您的 API 进行版本控制很容易,请执行以下操作;
/v1/some-resoure
/v2/some-resource
或者有些人更喜欢向域添加版本控制以保持 URI 更清晰;
v1.api.com/some-resource
v2.api.com/some-resource
对于移动应用程序的版本控制,听起来您的 API 关心正在使用的应用程序版本,对吗?如果是,则这是客户状态。我们需要在 URI 中传递这个状态。所以你可以拥有;
/some-resource?clientVersion=1
/some-resource?clientVersion=2
每个调用现在都会告诉您 API 正在使用哪个版本。不过,我不得不说,这有点奇怪。你不应该像这样将你的 API 与你的客户联系起来。您的 API 不应该关心正在使用什么客户端,更不用说版本了。相反,每个客户端应该只关心它使用的 API 的版本。
如果您的客户端版本 1 依赖于您 API 的响应等中的某些事情是真实的,您需要确保您的 api 版本(见上文) .所以也许您的客户端的版本 1 只调用 /v1....
假设您现在拥有客户端的第 12 版,现在您还想更改 API 的工作方式。您现在必须使用不同的 URI 版本公开资源,例如/v2...
版本 12 现在只调用 /v2...
URI。所有以前版本的客户 (1 - 11) 都不会受到影响,因为他们仍在使用 /v1...
接下来的问题是,您将 API 上的版本保持活动状态多长时间?这是一个标准的版本控制问题。如果您控制 API 和您的客户端,您将知道在停止客户端 (1-11) 之前需要多长时间,然后才能停止 /v1...
URI。
如果您不控制客户端,则需要与客户端的开发人员沟通您将停止使用 /v1...
API 版本控制的第一条规则:不要这样做。采取不同的方法:
- 仅进行向后兼容的更改,例如添加新字段(并避免删除或重命名字段)。
- 如果您必须进行不兼容的更改,则添加新资源并将旧资源留给旧客户。
- 如果由于业务变化太大而需要全部重新做,请添加一个新的 API(通常在第二个子域上)。
- 尝试使用超媒体,因为它将解决一些 问题(当然不是全部)。例如,参见 http://soabits.blogspot.dk/2013/12/selling-benefits-of-hypermedia.html 进行讨论。
Roy Fielding 在 InfoQ 的文章中对此有一个有趣的看法:http://www.infoq.com/articles/roy-fielding-on-versioning。
Mark Nottingham 在这里讲述了一个类似的故事:https://www.mnot.net/blog/2012/07/11/header_versioning。