我正在使用ASP.NET Web API为DVD租赁网站实现RESTful API。域模型(简化)由Customer
和Subscription
个实体组成。客户有相关的订阅。
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
通过将从数据库中读取的每个EndDate
实体的Subscription
字段与当前日期进行比较,需要定期检查过期订阅。对于已过期的每个订阅,应将关联客户的CustomerStatus
字段设置为已存档,并将电子邮件发送给客户。该操作将通过我们的REST API公开,并且每天从外部服务调用。
我应该根据RESTful原则使用什么URL方案来公开此操作?我的第一个想法是它是api/customers/{SomeResource}
上的PUT操作,因为它可能涉及更新零个或多个客户的CustomerStatus
字段,并且也是幂等操作。
例如:
PUT /api/customers/expired
听起来合理吗?
请注意,此请求中没有发送正文,因为正在更新其雕像的客户将从数据库中查询,而不是由最终用户提供。我的理解是PUT请求不必包含正文。
答案 0 :(得分:2)
这几乎肯定是POST
操作。
但是,我质疑您的服务设计。为什么您描述的行为需要通过RESTful API进行外部控制?如果事先知道操作的确切时间和性质,为什么不使用其他一些安排工作的方法...这种方法更直接,不会提出这类问题?
编辑:请注意,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)。