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

Iphone 为REST Api服务器编码移动设备版本,iphone,http,rest,mobile,http-headers,Iphone,Http,Rest,Mobile,Http Headers,我们有HTTP上的restful api。在其他客户机中,我们还有移动设备客户机(如iphone)。问题是有几个不同版本(1.0、2.0)的iphone应用程序。因为它们是分布式的,所以我们无法控制调用我们的应用程序版本 要在服务器端识别应用程序版本,我可以看到以下选项: 设备必须附加URL参数(例如/foo?iphone app version=1.0):有点恶心,但好的是我总是能在服务器日志上看到它(URL总是被记录) 我们使用HTTP摘要对api客户端进行身份验证。我们可以在用户名中对应用

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

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

  • 设备必须附加URL参数(例如/foo?iphone app version=1.0):有点恶心,但好的是我总是能在服务器日志上看到它(URL总是被记录)
  • 我们使用HTTP摘要对api客户端进行身份验证。我们可以在用户名中对应用程序版本进行编码(例如,iphone_1_0):幸好它记录在服务器日志中,但只适用于作为HTTP摘要公开的资源
  • 设备必须使用自定义HTTP头,例如X-IPHONE-APP-VERSION:在我看来,这是最干净的方法,但我们不在服务器日志中记录HTTP头(对于日志噪音,它是关闭的)。所以以后的分析是不可能的 您是否有首选方法或其他选择


    编辑:对于上述版本控制,我不是指api版本控制/内容协商。它是移动设备的版本。

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

    移动应用程序:

    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,因此书签和统计信息仍然有效。向新格式的迁移可以随着时间的推移逐步完成,对旧客户端的支持也可以逐步取消。

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

    移动应用程序:

    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,因此书签和统计信息仍然有效。向新格式的迁移可以随着时间的推移逐步完成,对旧客户端的支持可以逐步取消。

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

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

    已经有版本控制概念(通过头和perma链接)。我需要的是识别移动设备应用程序版本。此版本与api服务器版本不同。动机是了解最终用户使用的应用程序版本。是的,这可能适合()。到目前为止,我只看到这个标题来标识“连接构建器”(例如firefox、http commons客户端)。我将看看iphone当前发送的用户代理条目。也许我会将应用程序版本指纹添加到它上面(这类似于前面提到的X-IPHONE-app标题)。缺点仍然是我无法在生产模式日志中看到它,因为它没有包含在permalink中。所以,任何来自过去日志的统计数据仍然不起作用,只有临时打开的头日志才会显示。我决定不使用用户代理头,但使用自定义的X-xxx-User-Agent头。主要原因是用户代理已经被http客户端库或移动设备信息“污染”。自定义X-xxx-USER-AGENT更容易为服务器解析,并且不干预http库,后者通常会设置它,并且可以覆盖自定义条目。已经有版本控制概念(通过头和perma链接)。我需要的是识别移动设备应用程序版本。此版本与api服务器版本不同。动机是了解最终用户使用的应用程序版本。是的,这可能适合()。到目前为止,我只看到这个标题来标识“连接构建器”(例如firefox、http commons客户端)。我将看看iphone当前发送的用户代理条目。也许我会将应用程序版本指纹添加到它上面(这类似于前面提到的X-IPHONE-app标题)。缺点仍然是我无法在生产模式日志中看到它,因为它没有包含在permalink中。所以,任何来自过去日志的统计数据仍然不起作用,只有临时打开的头日志才会显示。我决定不使用用户代理头,但使用自定义的X-xxx-User-Agent头。主要原因是用户代理已经被http客户端库或移动设备信息“污染”。定制的X-xxx-USER-AGENT更容易为服务器解析,并且不会干预