环境
作为集成项目的一部分,我需要一个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 specs和odata.metadata
属性的值,我希望能够获得customer
实体的单个字段的$metadata
的概述,使用以下格式的链接:
https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata#customer/@<FieldName>
这没有按预期工作。请参阅下面的The issue
小节。
问题
由于某种原因,$metadata
后面的所有内容似乎都被忽略了。这意味着最后三个URL给予我的输出完全相同,这不是我所期望的。
实际问题
- 是否可以只获取一个集合或实体的元数据,就像我在上面的
The context
部分的Fetching collection-specific metadata
和Fetching entity-specific metadata
子部分中所尝试的那样? - 如果是,我做错了什么?我错过了什么?
2条答案
按热度按时间r1zhe5dt1#
正如评论中提到的@xuzhg和Github问题中提到的Support Metadata as a service (#181)一样,Odata
$metadata
看起来并不是一个真正的动态服务,它只是一个XML文件。这不仅解释了为什么在
https://<Server>:<WebServicePort>/<ServerInstance>/OData/$metadata#...
的链接中$metadata后面的内容会被忽略,还解释了为什么它只支持XML,而不支持Json(与实际的Odata服务不同)。cl25kdpy2#
由于所需的特定元数据由附加到元数据URI的片段标识,因此必须获取整个
$metadata
文档,然后在客户机上取消对片段的引用。好消息是片段解引用非常简单,像
#customer
这样的片段指定Name
属性值为customer
的EntityType
元素,类似地,#customer/@someprop
Map到Name
属性值为someprop
的Property
元素。