在 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 给了我完全相同的输出,这不是我所期望的。
实际问题
- 是否可以只获取一个集合或实体的元数据,正如我在上文
The context
部分的 Fetching collection-specific metadata
和 Fetching entity-specific metadata
小节中尝试的那样?
- 如果是,我做错了什么?我错过了什么?
与@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
.
环境
作为集成项目的一部分,我需要一个 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 给了我完全相同的输出,这不是我所期望的。
实际问题
- 是否可以只获取一个集合或实体的元数据,正如我在上文
The context
部分的Fetching collection-specific metadata
和Fetching entity-specific metadata
小节中尝试的那样? - 如果是,我做错了什么?我错过了什么?
与@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
.