RESTFUL(超媒体)API中的动词

时间:2014-11-14 10:18:36

标签: rest asp.net-web-api2

我在启动出现在我的API中的RPC样式动词时遇到了一些麻烦。

我的问题是:在Restful API中使用这些动词,“提交”,“SendForApproval”,“接受”和“拒绝”是否可以?这违反了Restful原则吗?命名这些操作的最佳做​​法是什么?

我们的商业案例: 我有一个订单。它始于“已预订”状态。然后,我想调用以根据业务逻辑验证订单。根据验证结果,我可以提交或发送批准。审批流程在我们的解决方案外部进行,然后在审批流程完成后,将调用Api将订单标记为已接受或已拒绝。

还有一些事情比简单地更新状态还要多 - 我们将事情发送到打印队列,分离跟踪文档等。

所以我们定义的URI是

https://api.site.com/orders               // A list of orders
https://api.site.com/orders/{orderId}     // An order
https://api.site.com/orders/{orderId}/ValidationErrors   // Get a list of validation results
https://api.site.com/orders/{orderId}/Submit             // Submit the order for processing
https://api.site.com/orders/{orderId}/SendForApproval    // Send to supervisor
https://api.site.com/orders/{orderId}/Accept             // Supervisor Accepts the order for processing
https://api.site.com/orders/{orderId}/Reject             // Supervisor can Reject the order

3 个答案:

答案 0 :(得分:3)

您必须尽可能避免在URI中插入谓词。此外,我不同意user1438038,因为QueryString过滤器应该用于搜索目的而不是指定操作。

我相信有更好的方法来解决这个问题。首先,请考虑到您不应该以与业务对象高度相关的方式对RESTful API进行建模(假设您使用的是OO方法)。此外,请记住,在REST透视图中,您公开的所有内容都是资源,而不是具有其状态和行为的对象。

我建议你采用不同的方法,但我不确定它是否能满足你的系统要求,但也许给你一些想法是有用的。在您的情况下,您可以拥有多个资源,如PreOrders,Orders,Supervisors ......

https://api.site.com/preorders

GET - Display all pre-orders.
POST - Create a new pre-order.

创建新订单:

https://api.site.com/preorders/1 

POST - approves the pre-order. This action's gonna create a new Order.

显示所有等待批准的订单(由ID = 1的主管)。

https://api.site.com/supervisors/1/orders

搜索已批准和已取消的订单:

https://api.site.com/supervisors/1/orders?status=canceled
https://api.site.com/supervisors/1/orders?status=approved

取消或批准订单:

https://api.site.com/supervisors/1/orders/1 (DELETE cancels the order)
https://api.site.com/supervisors/1/orders/1 (POST approves the order)

我不确定这是解决问题的最佳方法,但我很确定它比在URI中使用动词更好。

答案 1 :(得分:1)

我没关系,我们正在使用非常类似的设置进行订单管理。

但是,另一种可能性是传递action参数,例如:

https://api.site.com/orders/{orderId}/?action=accept
https://api.site.com/orders/{orderId}/?action=reject
...

REST的一般概念是拥有资源(例如订单客户)。你想要的更多是RPC语义,但没有对错。你的方法是合理的。

答案 2 :(得分:0)

在REST uris中,动词不是一个好习惯。

因此,如果您想以任何顺序更改状态,您可以向https://api.site.com/orders/ {orderId}发送PUT / POST,仅更新您的商务逻辑所需的值。