我已经看到了大量关于如何为基本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
更好吗?
答案 0 :(得分:2)
任何时候你想要像“删除”这样的动词建模,你应该想到DELETE
。同样,对于“创建”思考POST
(和/或可能PUT
),对于“阅读”思考GET
和“更新”思考PUT
(或者可能{{} 1}})。
因此,对于“删除旧订单”的示例,您绝对应该使用PATCH
。现在,您唯一的挑战是如何识别应该删除的订单。一旦你搞清楚了,URI方案就会随之而来。
以下是一些选项:
DELETE
此处,DELETE http://your-api.com/old-orders
的含义和范围将由接收此请求的服务器确定。这使得客户不必这样做,但却无法改变该范围。
old-orders
这将返回GET http://your-api.com/order-query?days-older-than=730
URI Location
,表示旧约会的集合。然后你可以简单地在该URI上发出一个DELETE来一次性清除旧记录。
不是强制客户端记住发出此类型的删除命令,而是提供某种http://your-api.com/order-query-result/{some ID}
资源,可以通过您的API操作来设置configuration
之类的字段,以及让服务器以purgeRecordsOlderThanDays=730
的方式自动为您完成。这将是我的首选方法。
答案 1 :(得分:0)
对于导出,则需要删除“export”动词并将其替换为资源的ESB表示形式: -
GET http://someapp/customer/{id}
GET http://someapp/customer/{id}/ESB
答案 2 :(得分:0)
例如,让我们在我的应用服务中说我有一个电话 RemoveOldOrders(int customerId)将删除任何订单 具有id" customerId"的客户超过2年的系统。 在我的宁静服务上,URL会是什么样子?什么会 通话的有效负载看起来像?我会使用什么HTTP方法(POST?)?
RemoveOldOrders(int customerId)
DELETE /oldOrders {customerId: id}
DELETE /customer/{id}/orders?old=true
etc...
您应该详细了解uniform interface / resource identifiers和HTTP method specification。
网址并不重要。重要的是你应该拥有资源标识符(URL)的资源,你必须使用统一(标准)接口来操作它们,比如调用HTTP方法。