【问题标题】:Fetching $metadata for a specific collection or entity with Odata web services in Microsoft Dynamics NAV 2016在 Microsoft Dynamics NAV 2016 中使用 Odata Web 服务获取特定集合或实体的 $metadata
【发布时间】:2022-05-26 02:24:15
【问题描述】:

环境

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

Microsoft 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 specsodata.metadata 属性的值,我希望能够使用customer 实体获得$metadata 的概览链接格式如下:

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

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

获取实体特定的元数据

同样,在检索单个客户时,基于我的数据集的the Odata v3 specsodata.metadata 属性的值,我希望能够大致了解单个字段的$metadata customer 实体,使用这种格式的链接:

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

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

问题

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


实际问题

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

【问题讨论】:

  • 您似乎正在寻找作为服务的元数据。它现在在 ODL 中不支持,在 Dynamics CRM 中也不支持。见issue
  • @SamXu :那么,这是否意味着元数据真的只是一个静态文件?!实际上,这可以解释很多!
  • 到目前为止,我是这么认为的。但是,元数据对客户来说是有用且必要的。例如,OData 客户端或类似客户端可以读取元数据内容以生成用于访问服务的代码。

标签: web-services odata metadata microsoft-dynamics dynamics-nav


【解决方案1】:

正如 cmets 中的 @xuzhg 所建议的那样,以及像 Support Metadata as a service (#181) 这样的 Github 问题所表明的那样,Odata $metadata 似乎并不是真正的动态服务。相反,它只是一个 XML 文件。

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

【讨论】:

  • 根据RFC 3986,HTTP 客户端在发送请求之前剥离# 及其之后的所有内容(即片段)。
  • 此外,元数据没有 JSON 表示,因为元数据模式没有基于 JSON 的表达 (CSDL)。
  • @lencharest :我猜# 是一种赠品。我只是没想到元数据是完全静态的。同样,我只是没想到 Json 服务的元数据会在 XML 中定义。也许对微软这样的公司抱有更多期望是天真的,但是将 Json 服务的元数据作为纯 XML 的静态文件对我来说有点匆忙/草率,特别是考虑到这已经是他们的 Odata Web 服务标准的 v3。
  • 在创建 OData 时,XML 仍然是王道。 Atom (XML) 是主要的 OData 序列化格式。在 OData 中使用 CSDL 源于微软对 EF 和 EDM 的投资,以及 OData 对后者的依赖。既然 JSON 方兴未艾,就有了interest in adopting Swagger/OpenAPI 来表示元数据。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多