【问题标题】:RESTful URL for RPC-like operation用于类似 RPC 的操作的 RESTful URL
【发布时间】:2016-10-22 01:58:27
【问题描述】:

我正在使用 ASP.NET Web API 为 DVD 租赁网站实现 RESTful API。域模型(简化)由CustomerSubscription 实体组成。客户有关联的订阅。

API 公开的大部分操作都是简单的 CRUD 操作,它们很容易根据 RESTful 原则进行建模。例如。

GET /api/subscriptions/1 - get subscription with id 1
POST /api/subscriptions - add a new subscription
PUT /api/customers/2 - update customer with id 2 with contents of PUT body

需要定期检查过期订阅,方法是将我们数据库中读取的每个 Subscription 实体上的 EndDate 字段与当前日期进行比较。对于每个已过期的订阅,关联客户的CustomerStatus 字段应设置为已存档,并向客户发送电子邮件。该操作将通过我们的 REST API 公开,并每天从外部服务调用。

根据 RESTful 原则,我应该使用什么 URL 方案来公开此操作?我的第一个想法是它是对api/customers/{SomeResource} 的 PUT 操作,因为它可能涉及更新零个或多个客户的 CustomerStatus 字段,并且也是一个幂等操作。

例如:

PUT /api/customers/expired

这听起来合理吗?

请注意,此请求中没有发送正文,因为正在更新其状态的客户是从数据库中查询的,而不是由最终用户提供的。我的理解是 PUT 请求不必包含正文。

【问题讨论】:

  • 不 PUT 通常表示添加记录,POST 将是更新。
  • @Kevin -- 不,比这更复杂。

标签: c# rest asp.net-web-api restful-url


【解决方案1】:

这几乎可以肯定是POST 操作。

但是,我质疑你们服务的设计。为什么您描述的行为需要通过 RESTful API 进行外部控制?如果事先知道操作的确切时间和性质,为什么不使用其他一些方法来安排作业……一种更直接且不会引发此类问题的方法?

参考:Stack Overflow

编辑:请注意,OP 描述的操作不是幂等的,因此不是合格的PUT 操作。

其他编辑:note that the .Net framework uses the POST method by default for service endpoints marked with the WebInvoke attribute。根据the documentation for this attribute,它表示“逻辑上是调用操作”的端点。对我来说,这读起来就像一个远程过程调用(即 RPC)。

【讨论】:

  • 即使事先不知道,最好公开一个让客户端控制调度的资源,而不是让它们直接 POST 来执行操作。 POST 使您容易受到网络问题和其他外部故障的影响。
  • 我完全同意,暴露这种操作不仅效率低,而且不安全。您的操作是可明确安排的,应该完全从应用程序的边界后面处理。
  • 通过从应用程序边界后面处理调度,您是否建议它从 Web 进程内作为后台作业运行?我考虑过这一点,尽管有诸如 Hangfire 之类的框架可以促进这一点,但以这种方式运行后台任务可能会出现问题。由于应用程序将托管在 Azure 中,因此目的是安排 Azure WebJob 定期调用 API 端点,该端点将使用 OAuth2 进行保护。
  • 不过同意应该是POST操作。
  • 很公平,@aw1975!如果您同意这是正确答案,请考虑正式“接受”它。谢谢!
猜你喜欢
  • 2012-10-27
  • 2018-06-17
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2014-03-08
  • 2016-10-07
相关资源
最近更新 更多