代码之家  ›  专栏  ›  技术社区  ›  manuel aldana

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

  •  1
  • manuel aldana  · 技术社区  · 15 年前

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

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

    1. 设备必须附加URL参数(例如/foo?iphone应用程序版本=1.0):有点奇怪,但好在我可以在服务器日志中看到它(URL总是被记录)
    2. 我们使用HTTP摘要对api客户端进行身份验证。我们可以在用户名内对应用程序版本进行编码(例如iphone_1_0):很好,它已经登录到服务器日志中,但只适用于公开为HTTP摘要的资源。
    3. 设备必须使用自定义的HTTP头,例如X-IPHONE-APP-VERSION:在我看来是最干净的方法,但我们不会在服务器日志中记录HTTP头(对于日志噪音,它被关闭)。所以以后的分析是不可能的。

    你有没有首选的方法或其他选择?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Darrel Miller    15 年前

    您可以使用Accept头来允许客户端通过标识其支持的媒体类型的版本来声明其具有哪些功能。例如

    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 然后新代码就可以接管。

        2
  •  0
  •   manuel aldana    15 年前

    我决定定制X-xxx-USER-AGENT one。决定不采用更标准的“用户代理”的主要原因是已经被http客户端库或移动设备信息“污染”。定制的X-xxx-USER-AGENT更容易为服务器解析,并且不干涉http库,后者经常设置它,并且可以覆盖定制条目。