2010-10-15 71 views
1

我们通过HTTP获得了restful api。在其他客户中,我们也有移动设备客户端(例如iphone)。问题是有几个不同版本的iphone应用程序(1.0,2.0)。由于它们是分布式的,我们无法控制哪个应用程序版本正在调用我们。编码REST的移动设备版本API服务器

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

  1. 设备必须附加URL参数(例如/foo?iphone-app-version=1.0):有点令人讨厌,但良好事情是,我可以始终在服务器日志中看到它(始终记录URL)
  2. 我们使用HTTP摘要验证api-clients。我们可以在用户名内编码应用程序版本(例如iphone_1_0):它记录在服务器日志中的好东西,但只适用于作为HTTP摘要公开的资源。
  3. 设备必须使用自定义HTTP标头,例如X-IPHONE-APP-VERSION:在我看来是最干净的方法,但我们不会在服务器日志中记录HTTP标头(对于关闭它的对数噪声)。所以后来的分析是不可能的。

您是否有首选方法或其他选择?

编辑:与上述版本我不是指API版本/内容协商。它是移动设备的版本。

回答

0

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

1

您可以使用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,因此书签和统计数据仍然有效。向新格式迁移可以逐步完成,对老客户的支持可逐渐淘汰。

+0

已经有版本控制概念(通过头文件和perma-link)。我需要的是识别移动设备应用程序版本。这个版本与api-server版本不同。动机是知道最终用户使用哪些应用程序版本/版本。 – 2010-10-15 17:11:14

+1

@manuel这不是用户代理标头的用途吗? – 2010-10-15 17:18:48

+0

是的,这可能适合(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43)。到目前为止,我只看到这个头文件来标识“连接构建器”(例如firefox,http-commons客户端)。我将查看一下User-Agent条目iphone当前正在发送的内容。也许我只是将app-version-fingerprint附加到它上面(这与提到的X-IPHONE-APP头相似)。缺点仍然是生产模式日志中看不到它,因为它不包含在永久链接中。所以仍然任何来自过去日志的统计信息都不会起作用,只有临时打开的标题日志才会显示。 – 2010-10-15 17:31:39

相关问题