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

0s7z1bwu  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(145)

环境
作为集成项目的一部分,我需要一个PHP网站,以便能够读取和写入Microsoft Dynamics NAV 2016的Odata服务。
微软Dynamics NAV 2016使用the Odata v3 standard
环境
现在,让我们以我的customer服务为例。

获取实体集合

使用以下格式的链接可以很好地获取我的customer实体集合的概述:

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

提取单个实体

使用具有以下格式的链接,可以根据id提取单一customer实体:

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

获取全局元数据

通过使用以下格式的链接,可以很好地为我的所有服务获得$metadata的概述(尽管它缺少Json支持):

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

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

现在,基于the Odata v3 specs和我的客户概述服务的odata.metadata属性的值,我希望能够使用以下格式的链接获得customer实体的$metadata的概述:

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

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

提取实体特定的元数据

类似地,在检索单个客户时,基于数据集的the Odata v3 specsodata.metadata属性的值,我希望能够获得customer实体的单个字段的$metadata的概述,使用以下格式的链接:

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

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

问题

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

实际问题

  • 是否可以只获取一个集合或实体的元数据,就像我在上面的The context部分的Fetching collection-specific metadataFetching entity-specific metadata子部分中所尝试的那样?
  • 如果是,我做错了什么?我错过了什么?
r1zhe5dt

r1zhe5dt1#

正如评论中提到的@xuzhg和Github问题中提到的Support Metadata as a service (#181)一样,Odata $metadata看起来并不是一个真正的动态服务,它只是一个XML文件。
这不仅解释了为什么在https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata#...的链接中$metadata后面的内容会被忽略,还解释了为什么它只支持XML,而不支持Json(与实际的Odata服务不同)。

cl25kdpy

cl25kdpy2#

由于所需的特定元数据由附加到元数据URI的片段标识,因此必须获取整个$metadata文档,然后在客户机上取消对片段的引用。
好消息是片段解引用非常简单,像#customer这样的片段指定Name属性值为customerEntityType元素,类似地,#customer/@somepropMap到Name属性值为somepropProperty元素。

相关问题