问题标签 [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.
asp.net-web-api - 带有 BindingModel 的 ASP.NET Web API OData v4 Post
我有一个 OData Web API 控制器,它有一个 POST 来插入一个 UserProfile,但是为了不暴露我的数据库实体,我希望 Post 方法接受一个 UserProfileBindingModel。这可能吗?
目前,我的 UserProfiles 中有以下内容:
这是我的 ODataConfig.cs 文件:
UserProfile 在哪里:
UserProfile 的 Fluent API 是:
而 UserProfileViewModel 是:
UserProfileBindingModel 是:
Get 方法工作正常,但使用 post 方法我收到以下消息:
实体类型“UserProfileBindingModel”与提供的实体集“Default.Container.UserProfiles”的基本类型“UserProfile”不兼容。当为 OData 提要或条目阅读器指定实体类型时,它必须与指定实体集的基本类型相同或子类型。
一定有办法做到这一点......有什么想法吗?
干杯
odata - 另一个 JSON 对象内的 JSON 对象的 Odata 过滤器
我有一个 odata 服务,它返回一个如下所示的 Json 对象,我想过滤国家/地区的数据。可能吗?
我知道我们可以使用“服务 url?$filter= Gender eq male”按性别过滤它,但我如何按国家/地区过滤它?
asp.net-web-api - 将计算值添加到 OData 结果
我正在尝试向数据结果添加一些信息,无论用户是否具有对该实体的读取或写入访问权限。
假设我有这个实体:
保存AccessRights
用户 ID 的位置以及他们是否具有读/写访问权限。
目前我只是$expand
AccessRights 并计算用户是否在前端具有读/写访问权限。但是,我希望将此计算属性添加到结果中。
示例 json 结果:
是否有可能做到这一点?请记住,HasRead/WriteAccess
模型上不存在也不应该存在。
c# - OData 连接服务与 OData V4 客户端代码生成器
我知道这些扩展是用来生成基于 Odata 服务的客户端代码的。
- OData 连接服务与 OData v4 客户端代码生成器扩展之间有什么区别。
- 这些扩展的目的是什么?
- 何时应使用 OData 连接服务,何时应使用客户端代码生成器?
谁能解释一下利弊?
asp.net - 如何处理 Odata V4 客户端中的异常?
Asp.Net Web API Odata 控制器操作:
Odata客户端代码:(Odata v4客户端代码生成器v4)
我想AddProducts()
在保存更改的同时在 Method 中以适当的方式处理异常。
如何捕获ModelState
从服务器发送的错误return BadRequest(ModelState);
?
最后,我只想将错误消息显示给从服务器发送的最终用途。示例:“产品类别是必需的。”
上课有什么用ODataException
?这会帮助我吗?
请帮我。
c# - Web API OData(OData Client v4)键中的正斜杠
我创建了一个 OData Web API,但在查找主键包含正斜杠的数据时遇到问题。
此网址按预期返回数据:
/api/SalesOrders('12345')
但是这个带有正斜杠的键失败:
/api/SalesOrders('12345/1')
即使编码:
/api/SalesOrders('12345%2F1')
在出现的错误中(见下文),看起来最后的正斜杠正在转换为您所期望的反斜杠,因为它是 url 的一部分而不是查询字符串:
如果我改用以下 url,其中正斜杠位于查询字符串中,则数据将正确返回:
/api/SalesOrders?$filter=SalesOrderNumber eq 12345/1
如果我自己生成网址,这将不是什么大问题。
但是,我使用的是OData v4 客户端代码生成器
所以代码中的调用实际上是这样的:
var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();
这会生成在查询字符串之前包含正斜杠的 url,因此会失败。
- 这是 OData v4 客户端的已知问题吗?
- 是否有强制使用查询字符串而不是主键类型调用的设置?
我可以通过将正斜杠强制到查询字符串中来解决此问题,如下所示:
var salesOrder = erpClient.SalesOrders.Where(so => so.SalesOrderNumber == "12345/1" && so.SalesOrderNumber == so.SalesOrderNumber).FirstOrDefault();
这会强制在查询字符串中使用正斜杠:
/api/SalesOrders?$filter=SalesOrderNumber eq '450993/1' 和 SalesOrderNumber eq SalesOrderNumber
这感觉很混乱,我想避免离开 OData v4 客户端,因为我们有几个应用程序已经在使用它。
我还能做些什么来使这项工作更整洁吗?
脚注:
我按照这个博客上的过程来处理特殊字符,但这不包括关于如何处理正斜杠的建议:
c# - Asp.Net WebApi OData v4 - 保存实体以及相关实体
考虑关注实体
根据上面的代码,供应商实体可以有零个或多个产品。在上述实体中,ID 由实体框架自动生成。
我正在使用 Odata V4 客户端代码生成器。
客户代码:
供应商控制器:
产品控制器:
当我保存更改时,我收到一条错误消息:
INSERT 语句与 FOREIGN KEY 约束冲突。
错误的原因是Product
实体还没有SupplierId
数据库生成的密钥。
那么如何在保存记录的同时添加SupplierId
到Product
实体中呢?谁能帮我解决这个问题?
asp.net - 覆盖 webapi odata 链接的主机
我正在使用 WebAPI 2.2 和 Microsoft.AspNet.OData 5.7.0 创建支持分页的 OData 服务。
当托管在生产环境中时,WebAPI 存在于未暴露在外部的服务器上,因此 OData 响应中返回的各种链接,例如@odata.context
和@odata.nextLink
指向内部 IP 地址http://192.168.X.X/<AccountName>/api/...
等。
我已经能够Request.ODataProperties().NextLink
通过在每个 ODataController 方法中实现一些逻辑来用外部 URL 替换内部 URL来修改https://account-name.domain.com/api/...
,但这非常不方便,它只修复了 NextLinks。
有没有办法在配置 OData 服务时设置外部主机名?我看到了一个属性Request.ODataProperties().Path
,想知道是否可以在config.MapODataServiceRoute("odata", "odata", GetModel());
调用时设置基本路径,或者在GetModel()
实现中使用例如ODataConventionModelBuilder
?
更新:到目前为止,我想出的最佳解决方案是创建一个BaseODataController
覆盖该Initialize
方法并检查是否Request.RequestUri.Host.StartsWith("beginning-of-known-internal-IP-address")
然后像这样进行 RequestUri 重写:
这完美地修复了@odata.nextLink
所有控制器的 URL,但由于某种原因,@odata.context
URL 仍然得到AccountName
部分(例如https://account-name.domain.com/AccountName/api/odata/$metadata#ControllerName)所以它们仍然没有工作。
asp.net - 当站点具有全局 AuthorizeAttribute 时,ASP.NET 允许匿名访问 OData $metadata
我有一个 ASP.NET OData 站点,它在 WebApiConfig 文件中有以下内容:
这会强制所有调用者在调用任何控制器之前进行身份验证。
不幸的是,这也强制用户身份验证访问“$metadata”网址。
我需要对所有控制器访问进行全局强制身份验证,同时还允许匿名访问“$metadata”url。
java - 如何在 Apache Olingo V4 Java API 中使用字符串枚举
我只是不知道在数据创建过程中如何使用CsdlEnumType
Apaches Olingo V4 Java API。
到目前为止,这是我用尽可能少的代码所做的事情:
1)在我的EdmODataProvider.java
班级中,我创建了一个实体类型并将FQDN
枚举实体添加到属性中。此外,我CsdlEnumType
在模式提供程序类中实例化了 。我想这是可行的,因为如果我在setValue()
部分中只使用数字,我会得到预期的结果。:
2)在我的数据提供者类中,我正在创建一个这样的实体:
如果我试图调用实体,我最终会收到错误:
我的$metadata
包含:
我想问题出在第 2 部分)中,我将属性添加DISPNAME
为字符串。知道如何解决这个问题吗?