RPC的RESTful URL
我正在使用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
通过比较从我们的数据库中读取的每个Subscription
实体的EndDate
字段与当前日期,需要定期检查过期的订阅。 对于每个已过期的订阅,应将关联客户的CustomerStatus
字段设置为已存档并发送给客户的电子邮件。 该操作将通过我们的REST API公开并每天从外部服务调用。
根据RESTful原则,我应该使用什么URL方案来公开此操作? 我首先想到的是,它是api/customers/{SomeResource}
上的PUT操作,因为它可能涉及更新零个或多个客户的CustomerStatus
字段,并且也是一个幂等操作。
例如:
PUT /api/customers/expired
这听起来合理吗?
请注意,此请求中没有主体发送,因为正在更新其状态的客户是从数据库查询而不是由最终用户提供的。 我的理解是,PUT请求不必包含正文。
这几乎可以肯定是一个POST
操作。
但是,我质疑您的服务的设计。 为什么您描述的行为需要通过RESTful API进行外部控制? 如果预先知道手术的确切时间和性质,为什么不使用其他方式安排工作......这种方法更直接,不会引发这类问题?
参考:堆栈溢出
编辑:请注意,由OP描述的操作不是幂等的,因此不是合格的PUT
操作。
附加编辑:请注意,.Net框架默认为使用WebInvoke属性标记的服务端点使用POST
方法。 根据此属性的文档,它表示“逻辑上是调用操作”的端点。 对我来说,这看起来像一个远程过程调用(即RPC)。
上一篇: RESTful URL for RPC