在 Microsoft Dynamics NAV 2016 中使用 Odata Web 服务获取特定集合或实体的元数据

Fetching $metadata for a specific collection or entity with Odata web services in Microsoft Dynamics NAV 2016

环境

作为集成项目的一部分,我需要一个 PHP 网站来读取和写入 Microsoft Dynamics NAV 2016 的 Odata 服务。

Microsoft Dynamics NAV 2016 使用 the Odata v3 standard.


上下文

现在,让我们以我的customer服务为例。

正在获取实体集合

获取我的 customer 个实体集合的概览效果很好,使用 link 格式如下:

https://<Server>:<WebServicePort>/<ServerInstance>/OData/Company(\'<CompanyName>\')/customer

获取单个实体

基于 id 获取单个 customer 实体工作正常,使用具有以下格式的 link :

https://<Server>:<WebServicePort>/<ServerInstance>/OData/Company(\'<CompanyName>\')/customer(\'<Id>\')

正在获取全局元数据

获取我所有服务的 $metadata 概览效果很好(尽管缺少 Json 支持),使用具有以下格式的 link:

https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata

正在获取集合特定的元数据

现在,根据 the Odata v3 specs 和我的客户概览服务 odata.metadata 属性 的值,我希望能够获得 [= customer 实体的 19=],使用具有以下格式的 link:

https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata#customer

这没有按预期工作。请参阅下面的 The issue 小节。

正在获取实体特定的元数据

同样,在检索单个客户时,基于 the Odata v3 specs 和我的数据集的 odata.metadata 属性 的值,我希望能够得到一个概览customer 实体的单个字段的 $metadata,使用格式为 link 的 $metadata :

https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata#customer/@<FieldName>

这没有按预期工作。请参阅下面的 The issue 小节。

问题

出于某种原因,$metadata 之后的所有内容似乎都被忽略了。这意味着最后三个 URL 给了我完全相同的输出,这不是我所期望的。


实际问题

@xuzhg suggested in the comments and as is indicated by Github issues like Support Metadata as a service (#181)一样,Odata $metadata 似乎并不是真正的动态服务。相反,它只是一个 XML 文件。

这不仅解释了为什么在格式 https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata#... 的链接中忽略 $metadata 之后的任何内容,而且还解释了为什么它只支持 XML,而不支持 Json(与实际的 Odata 服务不同).

由于您想要的特定元数据由附加到元数据 URI 的片段标识,因此您必须获取整个 $metadata 文档,然后在客户端取消引用该片段。

好消息是片段取消引用非常简单。像 #customer 这样的片段指定了一个 EntityType 元素,其 Name 属性的值为 customer。同样,#customer/@someprop 映射到 Property 元素,其 Name 属性为 someprop.