确定 OData 服务器版本

11
给定一个已知的OData端点,如何确定OData服务的版本是最好的方式?在这种情况下,客户端可以支持任何版本(1-4),但我需要知道如何格式化请求。
例如,对于V4服务,“OData-Version”返回“4.0”,但V3服务甚至没有该标头。
此外,查询服务根URL可能对具有大量实体的服务非常昂贵。例如,没有自定义对象的基本Dynamics 2016 Online服务返回2.7KB的数据,而我真正想要的只是版本标头。
那么,获取可靠版本号的最轻量级解决方案是什么?如果解决方案是“检查这个或者如果缺少,则检查那个”,那么也可以。是什么“这个”和“那个”?
我发现了一个问题(如何从元数据中找到OData版本),它在某种程度上帮助了我,但是答案有一些问题。
首先,它专注于查找最小/最大版本号,而我真正想要的是最大版本号。
其次,它需要查询元数据,但这可能会导致大量负载。在Dynamics CRM 2016 Online上,/$metadata会得到一个3.7MB的响应(在我的当前连接上需要30秒才能下载)。我考虑请求一个虚拟实体,比如/dummy__entity,然后检查头部信息,但我觉得这有点靠不住,因为这会在服务器上不必要地触发错误日志,并且我不确定错误响应总是有我要找的头信息。
1个回答

1

OData 1.0/2.0/3.0

根据MS-ODATA 1.7 版本和能力协商

在本文档中定义的 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版本的符合规范的服务将返回“1.0”用于由OData 1.0定义的功能,“2.0”用于由OData 2.0定义且未出现在OData 1.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开始,似乎可以可靠地获得所需的最高版本。
结论:目前没有明显的方法可以获取先前版本的OData支持的最高版本。DataServiceVersion响应头将包含基于URL特征、服务支持的OData版本和客户端请求的版本的最低可能版本号。然而,从OData 4.0开始,OData-Version响应头将始终包含基于服务支持和客户端请求的最高版本。

很不幸,在我尝试过的所有情况中,向OData 4.0服务传递“DataServiceVersion”标头都会导致500内部服务器错误响应(没有“OData-Version”标头)。因此,发送OData-VersionDataServiceVersion标头并不保证能够正常工作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接