我们有基于 HTTP 的 restful api。在其他客户端中,我们还有移动设备客户端(例如 iphone)。问题是有几个不同版本的 iphone 应用程序(1.0、2.0)。因为它们是分布式的,所以我们无法控制哪个应用程序版本正在调用我们。
要在服务器端识别应用程序版本,我会看到以下选项:
- 设备必须附加 URL 参数(例如/foo?iphone-app-version=1.0):有点讨厌,但好在我总能在服务器日志上看到它(URL 总是被记录)
- 我们使用 HTTP 摘要验证 api 客户端。我们可以在用户名中编码应用程序版本(例如 iphone_1_0):好在它记录在服务器日志中,但仅适用于作为 HTTP 摘要公开的资源。
- 设备必须使用自定义 HTTP header ,例如X-IPHONE-APP-VERSION:在我看来,这是最干净的方法,但我们不会在服务器日志中记录 HTTP header (对于日志噪音,它已关闭)。所以后面的分析是不可能的。
您有首选方法或任何其他替代方法吗?
编辑:对于上述版本控制,我不是指 api-versioning/content-negotiation。它是移动设备的版本。
最佳答案
您可以使用 Accept-Header 允许客户端通过识别其支持的媒体类型版本来声明其具有的功能。例如
移动应用可以:
GET /server/foo
Accept: application/vnd.acme.fooappV1+xml
当您引入不向后兼容的新功能时,您可以告诉新更新的客户端发送,
GET /server/foo
Accept: application/vnd.acme.fooappV2+xml
然后你的服务器知道它正在与之交谈的客户端的能力。 您还可以让新客户这样做:
GET /server/foo
Accept: application/vnd.acme.fooappV1+xml, application/vnd.acme.fooappV2+xml
这样您就可以慢慢地将您的服务器资源迁移到新格式。如果端点传送 application/vnd.acme.fooappV1+xml
,则客户端将恢复为旧方式。如果端点返回 application/vnd.acme.fooappV2+xml
,则新代码可以接管。
使用这种方法,不需要更改 URI,因此书签和统计信息仍然有效。随着时间的推移,可以逐步迁移到新格式,并且可以逐步取消对旧客户端的支持。
关于iphone - 为 REST Api 服务器编码移动设备版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943015/