iphone - 为 REST Api 服务器编码移动设备版本控制

标签 iphone http rest mobile http-headers

我们有基于 HTTP 的 restful api。在其他客户端中,我们还有移动设备客户端(例如 iphone)。问题是有几个不同版本的 iphone 应用程序(1.0、2.0)。因为它们是分布式的,所以我们无法控制哪个应用程序版本正在调用我们。

要在服务器端识别应用程序版本,我会看到以下选项:

  1. 设备必须附加 URL 参数(例如/foo?iphone-app-version=1.0):有点讨厌,但好在我总能在服务器日志上看到它(URL 总是被记录)
  2. 我们使用 HTTP 摘要验证 api 客户端。我们可以在用户名中编码应用程序版本(例如 iphone_1_0):好在它记录在服务器日志中,但仅适用于作为 HTTP 摘要公开的资源。
  3. 设备必须使用自定义 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/

相关文章:

ios - Fabric js 文本字符在 iPhone 和 iPad 上出现乱码

http - 如何在 ZF2 中使用自定义(非标准)HTTP 状态代码

node.js - 使用 Node 和 reSTLer 进行多部分表单数据 POST

c# - 如何在 C# 中使用 cookie 执行简单的 GET 请求

java - 仅使用 XML 配置的 Spring RESTful Web 服务

java - 如何在 spring boot 中启用/禁用特定的休息端点?

iphone - 使用核心动画的非平滑动画

iphone - 将 iTunes 中的图像同步到 iPhone 模拟器

iphone - Xcode iPhone 项目不再在我的 iPhone 上调试

java - SpringMVC-FileUpload - 客户端发送的请求在语法上不正确