问题标签 [odata-v4]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
401 浏览

java - Odata V4 客户端:getEntityCreate 方法

我用 Java 开发了一个 ODataClient 来创建新实体。我在创建新实体时遇到了困难。我主动查看了我的客户用 Fiddler 发送的所有消息。

在我用 Fiddler 获得的正文的第一行下方:

我使用 Fiddler 手动测试以创建一个新实体,消息正文的第一行应该是:

我想知道是否可以使用 Odata 设置请求正文以删除“@”和“#”。

谢谢,

0 投票
0 回答
183 浏览

java - 使用 Olingo 客户端的 odata GET 调用中的特殊字符

我正在使用 Olingo 4.2 java 库来调用我的 OData 服务。我正在进行和 odata GET 调用,并且在我的参数中有一个特殊字符,例如 www.example.com/service/People('abc}def{ghi')。当我使用 Olingo 客户端编码和进行 OData 调用时,我得到一个错误 -

地理不是可实例化的类型。实体可以将属性声明为几何类型。实体的实例不得具有几何类型的值。每个值必须是某个子类型。

当我从浏览器执行它时它工作正常。我无法避免在主键中有 {}(大括号)。有谁知道如何解决这一问题?

0 投票
2 回答
5012 浏览

json - 带有 OData v4 的 Web Api 2 - 返回复杂对象的绑定函数

在这个简单的示例中,我试图从 Web Api 2 + OData v4 服务中获取序列化为 JSON 的对象。控制器具有绑定函数 Test,它返回一个 annon 数组。对象。

Edm 是用这段代码构建的:

当我向服务发出请求时(例如http://localhost:9010/odata/Products(33)/Default.Test),我收到一个奇怪的响应 - 两个空对象的数组,如下所示:

在我的真实应用程序中,我使用 Newtonsoft 的 Json 转换器将对象序列化为 JSON 字符串 - 效果很好,但这个问题仍然困扰着我。我怀疑这与 OData 的默认序列化程序有关,但我不清楚如何配置它。

那么,是否可以以这样的方式配置 edm 函数的返回参数,以便正确序列化复杂对象?

谢谢!

0 投票
2 回答
7044 浏览

asp.net-web-api2 - OData V4 $expand 嵌套了 $filter 和 $orderby -- 在 expand 中组合 $filter 和 $orderby

我目前有一个具有以下模型的 OData V4 服务。
“类别”——“代码”
对于每个类别,可以有许多代码。

我需要 $expand the Codes, $filter where Active = true 然后 $orderby Codes.Description。

目前,以下工作正常,无需订购。

odata/Categories?$expand=Codes($filter=Active eq true)

这不起作用。

odata/Categories?$expand=Codes($filter=Active eq true&$orderby=Description)

我收到“在 URI 中指定的查询无效。位置 12 的语法错误。” &“‘描述)’中位置 12 的语法错误。”

基本上它正在读取“描述”之后的最后一个“)”作为错误。

0 投票
2 回答
2420 浏览

c# - OData V4 客户端添加子实体

我有一个父级 (Order) 和一个子级 (OrderDetail),其中 Order 已经存在于数据库中,并且 OrderDetail 也存在于数据库中。
我真正想做的就是添加另一个绑定到订单的 OrderDetail 记录。

我已经走了好几条路,我什至不确定什么是正确的路。
让我们假设它们之间的导航已经在工作。
我可以 $expand=OrderDetails 很好,我也可以 Orders(1)/OrderDetails 很好,并从 OrderDetails 执行相反的操作。

基于此更新数据服务,我需要做的就是调用 AddRelatedObject,然后将对象添加到 OrderDetails 集合中。

看起来很简单。
然而,当我执行 context.SaveChanges(SaveChangesOptions.ReplaceOnUpdate) 它会抛出一个错误。

{"error":{"code":"","message":"没有找到与请求 URI ' http://localhost/Test/odata/Orders(1)/OrderDetails '匹配的 HTTP 资源。"," innererror":{"message":"没有找到路由约定来为带有模板 '~/entityset/key/navigation' 的 OData 路径选择一个操作。","type":"","stacktrace":""} }}

但是,如果我导航到列出的 URL,它会显示数据。
提琴手的时间。
在 Fiddler 中,我可以看到这是对 URL 的 POST,而不是 GET。
它应该是一个 POST 但不是列出的 URL。
POST 应该是 /odata/OrderDetails

第二轮

仍然是带有错误的 POST,但 URL 略有不同,并且发布的 json 仅具有“/odata/OrderDetail(0)”,现在也具有“$ref”。

{"error":{"code":"","message":"没有找到与请求 URI ' http://localhost/Test/odata/Orders(1)/OrderDetails/ $ref'匹配的 HTTP 资源。 ","innererror":{"message":"没有找到路由约定来为模板 '~/entityset/key/navigation/$ref' 的 OData 路径选择操作。","type":"","堆栈跟踪”:””}}}

好吧,一个快速的网络搜索让我看到了这篇文章Entity Relations in OData v4 Using ASP.NET Web API 2.2
这篇文章说我需要在 Orders 控制器中添加一个“CreateRef”。
我确实在 Orders 控制器中创建了一个“CreateRef”,果然它被调用了,但是文章假设 OrderDetail 存在于数据库中。
它没有发布 json OrderDetail 对象。

第三轮

好吧,这似乎好多了。
没有错误,但它没有完全工作。
它向 /odata/OrderDetails(0) 发送了一个 PUT 并且它确实发送了 json OrderDetail 对象但是这应该是一个POST 而不是一个 PUT

我觉得我很接近,但我似乎无法弄清楚如何让它正常工作。

有任何想法吗?

0 投票
0 回答
1776 浏览

asp.net-web-api2 - OData V4 使用词汇注释传递数据注释

有谁知道如何在 OData V4 的元数据中设置/读取基于词汇的注释来定义诸如最大字符串长度之类的东西?

有一篇文章客户端注释支持,但它没有显示任何示例代码,而且我不能 100% 确定他们甚至在谈论数据注释。
它有如下代码:

但它没有解释“fullQualifiedTermName”或“qualifier”使用什么。
我正在添加“odata.inculde-annotations=*”,但这似乎没有帮助。

我也尝试过以下方法。

但这只会返回null。

我在 2012 年发现了一篇文章Vocabularies in WCF Data Services,其中讨论了对验证元数据的支持。
我要试一试。
我希望在 OData V4 中有一种简单/更好的方法来做到这一点。

更新 1
WCF 词汇表示例在 OData V4 中不起作用,因为 System.Web.Http.HttpConfiguration 中缺少 config.AnnotationsBuilder。

OData V4 支持此处定义的词汇表http://www.odata.org/vocabularies/甚至提供我需要的“元数据注释可以定义特定属性的有效值范围”但似乎没有任何示例代码SAP https://blogs.sap.com/2013/10/07/vocabulary-based-annotations/以外的任何文章使用它。

更新 2
在查看TripPinService之后,我注意到他们有一些预算注释,如下所示。

幸运的是,该项目的源代码是ODataSamples TripPin
查看服务后,我发现我首先必须创建自己的 xml 词汇表文件。(验证词汇表.xml)

在 WebApiConfig 文件中,我必须访问 xml 文件并将词汇注释添加到元数据中。
我很幸运,TripPin 的源代码为此提供了一个很好的帮助类。(我将其修改为如下所示)

然后我从 GetEdmModel() 方法内部调用它,如下所示:

如果有人知道如何通过名称而不是某个字符串值来访问该属性,那就太好了。
我确实尝试了 builder.EntityType().Property(p => p.FirstName) 但该类型不是 IEdmProperty。
无论如何继续前进......
所以现在使用我的浏览器访问 $metadata 我可以清楚地看到 FirstName 上的字符串长度属性。

这很好,但现在讨论下一个问题。如何从客户那里得到它?

好吧,一开始我试过了。

但这给了我以下错误。

值不能为空。参数名称:element 然后我尝试了:

但是注释为空。
我注意到调用 TryGetAnnotation 不会再次调用 OData 服务。
所以我想我必须阅读客户端 CSDL 文件,所以我回顾了 WCF 文章,但他们没有告诉你他们从哪里得到“注释”集合。

我仍在挖掘,但这正在成为一个失败的原因。
令人遗憾的是,微软想将 OData 作为一项如此出色的服务推出,但文档很少,支持小组也很小。
我有 4 个未解决的 OData 问题,而且命中率很低。
不要误会我的意思,我喜欢 OData,但这是一种爱/恨的关系。

更新 3
我当前的解决方法是创建一个看起来像我的实体的部分类,然后创建一个接口来包含数据注释。
给实体框架生成的类添加数据注解

0 投票
1 回答
329 浏览

asp.net-web-api - OData 函数路由约定

我已经研究 OData 一段时间了,我面临一个我找不到解决方案的特定要求,即在 OData 中调用一个函数,参数用斜杠括起来,换句话说,我需要完成这个:/ entity/key/functionName/param1/param2/param3/ 我试过使用[RoutePrefix("/entity/{key}/functionName/{param1}/{param2}..."] 没有任何成功。动作是这样的:

我知道您可以使用[RoutePrefix("/entity({key}/functionName(param1={param1}....). 但这不是我想要的。

有人知道它是否可以完成吗?

0 投票
1 回答
1664 浏览

odata - Odata v4 - $expand 然后扁平化结果

目标:扩展一个对象,并将一个嵌套属性投影到根选择上,以及其他道具。

有如下关系:

我想做一个预测,这将导致:

目前我在哪里得到这个:

使用的查询如下:

/odata/Product?$expand=Category($select=Name)&$select=Price

我希望写一个这样的投影:

/odata/Product?$expand=Category&$select=Price,Category/Name as CategoryName

或者

/odata/Product?$expand=Category&$select=Price,Category($select=Name as CategoryName)

或者

/odata/Product?$expand=Category&$select=Price,Category($select=Name)

这是可以实现的吗?谢谢!

PS OData V4。

0 投票
1 回答
751 浏览

asp.net-web-api2 - 如何控制 OData 错误详细信息的存在

我正在尝试控制来自 Web API 2 OData v4 服务的错​​误响应中是否存在详细信息。当我点击本地 IIS 上托管的 OData 服务时,我得到如下信息:

当我采用相同的服务并将其部署在远程服务器上,并使用相同的消息点击它时,我得到以下信息:

我猜“innererror”和“details”部分被抑制了,因为我正在远程调用服务?我很高兴“内部错误”部分被禁止了——我不想泄露这些细节——但我想公开“细节”部分,以便我可以就某些错误提供更多反馈。有没有一种简单的方法可以实现这一目标?

谢谢!

0 投票
2 回答
749 浏览

asp.net-web-api - 为什么集合值导航属性返回空列表和指向 CRM 2016 WEB API 中实际数据的参考链接

我不知道为什么集合值导航属性总是返回一个空列表并引用实际数据链接。

这是我尝试过的查询:

回复 :

如何在不对其引用 (new_product_new_subjectarea@odata.nextLink) 提出新请求的情况下获取导航属性 (new_product_new_subjectarea) 中的项目?