我已经看到了很多关于如何为基本CRUD操作构造URL的例子,但在谈论更多类似Command的操作或应用程序服务调用时却看不到什么.
例如,假设在我的应用程序服务中,我有一个类似于RemoveOldOrders(int customerId)的调用,它会从ID为“customerId”的客户中删除超过2年的系统中的任何订单.在我的宁静服务上,URL会是什么样子?呼叫的有效负载是什么样的?我会使用什么HTTP方法(POST?)?
我的想法是这样的:
/ Customer / 1 / RemoveOldOrders作为POST,具有空主体(因为customerID将来自url).
对这样的事情有很好的指导方针吗?
更新:我觉得我需要澄清一下我的问题,而不是关于可能的重复帖子的评论(是的,该帖子基本上要求同样的事情,但我并不觉得这个问题得到了很好的回答).
如果我想对资源执行操作但该操作不适合标准HTTP谓词,该怎么办?
另一个例子:我的应用程序被挂钩到ESB,需要有一种方法来强制将我的资源投影到ESB上进行处理?在我目前基于SOAP的Web服务中,我有一个方法,如:
ExportCustomer(int customerId)
现在,在RESTful服务的情况下,我怎么能在uri中表示这个动作? Brian Kelly的答案中的选项1似乎是最符合逻辑的,例如:
POST http://someapp/api/customer/1/export
或者会:
POST http://someapi/api/customer/export/1
会更好?
最佳答案 任何时候你想要建模像“删除”这样的动词,你应该想到DELETE.类似地,对于“创建”认为POST(和/或可能是PUT),对于“读取”认为GET和“更新”认为PUT(或者可能是PATCH).
因此,对于“删除旧订单”的示例,您绝对应该使用DELETE.现在,您唯一的挑战是如何识别应该删除的订单.一旦你搞清楚了,URI方案就会随之而来.
以下是一些选项:
>删除http://your-api.com/old-orders
这里,旧订单的含义和范围将由接收该请求的服务器确定.这使客户免于必须这样做,但却无法改变该范围.
>获取http://your-api.com/order-query?days-older-than=730
这将返回http://your-api.com/order-query-result/ {some ID}的位置URI,表示旧约会的集合.然后,您可以简单地在该URI上发出DELETE以一举清除旧记录.
>而不是强迫客户端记住发出这种类型的删除命令,而是提供某种配置资源,可以通过您的API操作来设置像purgeRecordsOlderThanDays = 730这样的字段,让服务器自动为您执行此操作.像cron一样的时尚.这将是我的首选方法.