鉴于已知的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
,然后检查标题,但这对我来说似乎有点不对,因为它会不必要地触发服务器上的错误记录,我不确定错误响应是否总是如此可能有我正在寻找的标题。
答案 0 :(得分:1)
根据MS-ODATA 1.7 Versioning and Capability Negotiation:
本文档中定义的OData协议允许使用DataServiceVersion(第2.2.5.3节)和MaxDataServiceVersion(第2.2.5.7节)版本请求标头以及DataServiceVersion(第2.2.5.3节)响应标头进行有限的功能协商。 p>
如果说“有限”,则表示有限:
在从服务器到客户端的响应中,指定了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 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-Version
和DataServiceVersion
标头。
最好的选择似乎是发送OData-Version
,然后寻找DataServiceVersion
响应标头(即使对于支持3.0的服务,它也可能是“1.0”)。如果响应中存在该标头,则发送第DataServiceVersion
标头为“3.0”的第二个请求。如果您get a 4xx response,请尝试“2.0”等。