RESTful URL 类 RPC 操作

RESTful URL for RPC-like operation

我正在使用 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 请求不必包含正文。

这几乎可以肯定是 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. Per the documentation for this attribute,它表示 "is logically an invoke operation" 的端点。对我来说,这就像一个远程过程调用(即 RPC)。