更正应用程序服务调用的RESTful URL约定?

时间:2012-03-28 15:34:13

标签: rest

我已经看到了大量关于如何为基本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

更好吗?

3 个答案:

答案 0 :(得分:2)

任何时候你想要像“删除”这样的动词建模,你应该想到DELETE。同样,对于“创建”思考POST(和/或可能PUT),对于“阅读”思考GET和“更新”思考PUT(或者可能{{} 1}})。

因此,对于“删除旧订单”的示例,您绝对应该使用PATCH。现在,您唯一的挑战是如何识别应该删除的订单。一旦你搞清楚了,URI方案就会随之而来。

以下是一些选项:

  1. DELETE

    此处,DELETE http://your-api.com/old-orders的含义和范围将由接收此请求的服务器确定。这使得客户不必这样做,但却无法改变该范围。

  2. old-orders

    这将返回GET http://your-api.com/order-query?days-older-than=730 URI Location,表示旧约会的集合。然后你可以简单地在该URI上发出一个DELETE来一次性清除旧记录。

  3. 不是强制客户端记住发出此类型的删除命令,而是提供某种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
  • 获取导出链接将返回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 identifiersHTTP method specification

网址并不重要。重要的是你应该拥有资源标识符(URL)的资源,你必须使用统一(标准)接口来操作它们,比如调用HTTP方法。