rest - Odata(V4) 操作是否只能通过 POST 调用?

标签 rest asp.net-web-api odata

Odata V4 规范表示操作可能具有可观察到的副作用,应使用 HTTP POST 调用。但我们确实有一些场景需要使用仅修改某些状态的操作。

例如:
1.
您可能希望将 id 标识的文档状态标记为锁定
端点 - .../Documents({id})/lock()。
由于我在这里进行部分更新,我认为 PATCH 更合适。

2.
您可能想提供两种删除文档的方法
a) 只是隐藏
端点 - ...../Documents({id})
这是 HTTP DELETE(无争议)

b) 永久删除
端点 - ...../Documents({id})/permanentDelete()
这是一个 ODATA 操作。
在我看来,HTTP 删除更合适此处而不是 HTTP POST。

从 Odata 的角度来看,推荐的方法是什么?非常感谢这里的任何帮助。

以下是来自 SPEC 的信息。

规范 11.5.4 操作

操作是 OData 服务公开的操作,在调用时可能会产生副作用。操作可以返回数据,但不得进一步由额外的路径段组成。 11.5.4.1 调用操作

要调用绑定(bind)到资源的操作,客户端向操作 URL 发出 POST 请求。操作 URL 可以从先前返回的实体表示中获得,也可以通过将命名空间或别名限定的操作名称附加到 URL 来构造,该 URL 标识其类型与绑定(bind)参数的类型相同或派生的资源。那个行动。绑定(bind)参数的值是在附加操作名称之前由 URL 标识的资源的值,任何非绑定(bind)参数值都根据特定格式在请求正文中传递。

提前致谢
--ksp

最佳答案

从 OData 的角度来看,您始终必须使用 POST 调用操作,使用任何其他动词是行不通的。

我个人认为您的两个示例都不太适合操作,因为已经有方法可以使用 OData 执行这些操作,并且它们使用您提到的动词。更新属性支持DELETE 支持修补和删除对象。您提到您有两种不同类型的删除操作,这更困难,但您可以使用自定义 header 来区分它们。

操作往往不适合正常的 CRUD 操作,因此并不总是清楚应使用哪个 HTTP 动词。

在您的示例中,使用 DELETE 和 PATCH 确实感觉是正确的。然而,问题的出现是因为我们需要有一个可遵循的标准,请记住,OData 操作都是可以通过元数据发现的,因此客户端可能会在不知道操作实际用途的情况下使用它,在这种情况下,我们需要定义某些东西。因为我们知道操作会以某种方式影响服务器,所以对我来说,POST 似乎是对所有操作都一致的最不坏的选项。

关于rest - Odata(V4) 操作是否只能通过 POST 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056798/

相关文章:

azure - 枚举 azure 休息调用响应时的 Mime 类型异常

odata - 在 CRUD 操作期间,Odata 适配器是否支持 "Patch"请求和 "$expand"查询?

rest - 单字 bool REST 资源的正确内容类型是什么?

rest - 在 REST API 中,DELETE 方法可以有参数吗?

api - Web API Post 方法不起作用

asp.net - 映射到 ASP.Net 4 中的 wwwroot?

c# - 如何在 ASP.NET 5/MVC 6 中创建响应消息并向其添加内容字符串

WCF 身份验证策略

javascript - 将变量打印到 JSON NodeJS

c# - 信封 Odata 响应