【问题标题】:Determine an OData server's version确定 OData 服务器的版本
【发布时间】:2016-09-24 02:59:12
【问题描述】:

给定一个已知的 OData 端点,确定 OData 服务版本的最佳方法是什么?此场景中的客户端可以支持任何版本(1-4),但我需要知道如何格式化请求。

例如,OData-Version 为 V4 服务返回“4.0”,但 V3 服务甚至没有该标头。

此外,对于具有大量实体的服务而言,查询服务根 URL 可能会非常昂贵。对于示例,没有自定义对象的基本 Dynamics 2016 Online 服务返回 2.7KB 的数据,而我真正想要的只是版本标头。

那么,获得可靠版本号的最轻量级解决方案是什么?如果解决方案是“检查这个,或者,如果缺少,那么检查那个”就可以了。什么是“这个”和“那个”?


我发现了一个问题 (How to find OData version from metadata),似乎部分让我明白了这一点,但答案存在一些问题。

首先,它的重点是找到我真正希望最大的最小/最大版本号。

其次,它需要查询元数据,但这是一个潜在的巨大负载。 Dynamics CRM 2016 Online 上的 /$metadata 会产生 3.7MB 的响应(在我当前的连接上下载需要 30 秒)。我考虑过请求一个虚拟实体,例如/dummy__entity,然后检查标头,但这对我来说似乎有点不确定,因为它会不必要地触发服务器上的错误日志记录,而且我不确定错误响应是否总是可能有我要找的标题。

【问题讨论】:

    标签: odata version


    【解决方案1】:

    OData 1.0/2.0/3.0

    根据MS-ODATA 1.7 Versioning and Capability Negotiation

    本文档中定义的 OData 协议支持使用 DataServiceVersion(第 2.2.5.3 节)和 MaxDataServiceVersion(第 2.2.5.7 节)版本请求标头和 DataServiceVersion(第 2.2.5.3 节)响应标头进行有限能力协商。

    当它说“有限”时,它的意思是有限

    在从服务器到客户端的响应中,指定了 DataServiceVersion(第 2.2.5.3 节)标头。该值表示服务器在请求中用于生成响应的协议版本,客户​​端使用该协议版本来确定它是否可以正确解释响应(即,该值不大于关联请求中发送的 MaxDataServiceVersion(第 2.2.5.7 节)标头的值)。标头的值是服务器可用于满足请求的协议的最低版本

    因此,基本上,能够处理 OData 版本 1.0 到 3.0 的一致服务将为 OData 1.0 定义的功能返回“1.0”,为 OData 2.0 定义且在 OData 1.0 中不存在的功能返回“2.0”等。

    OData 4.0

    根据OData Version 4.0 Part 1: Protocol, Section 8.1.5 Header OData-Version

    OData 服务必须在响应中包含 OData-Version 标头以指定用于生成响应的协议版本。客户端必须根据协议指定版本中定义的规则解释响应。

    根据What's New in OData Version 4.0, Section 2.1.1 Improved: Protocol Versioning

    服务现在以服务器支持的最大协议版本进行响应,并指示客户端可以接受。

    另外不包括“降级”到 4.0 之前的版本,建议服务发布者为 4.0 服务使用新的服务根 URL。

    因此,对于 OData 的未来版本,从 4.0 开始,我似乎可以可靠地获得我正在寻找的最大版本。

    结论

    没有明显的方法可以获取 4.0 之前的服务支持的最大 OData 版本。 DataServiceVersion 响应标头将包含可能的最低版本号,具体取决于存在的 URL 功能、服务支持的 OData 版本和客户端请求的版本。

    但是,从 OData 4.0 开始,OData-Version 响应标头将始终包含基于服务支​​持和客户端请求的最大版本。

    不幸的是,到目前为止,在我尝试过的每个实例中,将“DataServiceVersion”标头传递给 OData 4.0 服务都会导致 500 内部服务器错误响应(没有 OData-Version 标头)。因此,似乎不能保证同时发送 OData-VersionDataServiceVersion 标头。

    最好的办法似乎是发送OData-Version,然后寻找DataServiceVersion 响应标头(即使对于支持3.0 的服务也可能是“1.0”)。如果响应中存在该标头,则发送第二个请求,其 DataServiceVersion 标头为“3.0”。如果你get a 4xx response,那就试试“2.0”等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多