RESTFUL(超媒体)API中的动词

RESTFUL(超媒体)API中的动词,rest,asp.net-web-api2,Rest,Asp.net Web Api2,我的API中开始出现RPC样式的动词时遇到了一些问题 我的问题是:在Restful API中使用这些动词Submit、SendForApproval、Accept和Reject可以吗?这是否违背了宁静的原则?命名这些操作的最佳实践是什么 我们的商业案例: 我有订单。它开始于预定状态。然后我想打电话根据我们的业务逻辑验证订单。根据验证结果,我要么提交,要么发送以供批准。审批流程发生在我们的解决方案的外部,然后当它通过审批流程时,调用Api将订单标记为接受或拒绝 除了简单地更新状态,还有更多的事情要

我的API中开始出现RPC样式的动词时遇到了一些问题

我的问题是:在Restful API中使用这些动词Submit、SendForApproval、Accept和Reject可以吗?这是否违背了宁静的原则?命名这些操作的最佳实践是什么

我们的商业案例: 我有订单。它开始于预定状态。然后我想打电话根据我们的业务逻辑验证订单。根据验证结果,我要么提交,要么发送以供批准。审批流程发生在我们的解决方案的外部,然后当它通过审批流程时,调用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

我可以接受,我们在订单管理中使用了非常类似的设置

但是,另一种可能是传递动作参数,例如:

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

REST的一般思想是拥有诸如订单或客户之类的资源。您想要的更多的是RPC语义,但没有对错之分。您的方法是合理的。

我可以接受,我们在订单管理中使用了非常类似的设置

但是,另一种可能是传递动作参数,例如:

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

REST的一般思想是拥有诸如订单或客户之类的资源。您想要的更多的是RPC语义,但没有对错之分。您的方法是合理的。

在REST URI中使用动词不是一个好做法


因此,如果您想以任何顺序更改状态,可以向{orderId}发送PUT/POST,只更新您想要的业务逻辑值。

在REST URI中使用动词不是一个好做法


因此,如果您想以任何顺序更改状态,您可以向{orderId}发送PUT/POST,只更新您想要的业务逻辑值。

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

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

我将向您建议一种不同的方法,但我不确定它是否能够满足您的系统需求,但也许它可以为您提供一些有用的想法。在您的情况下,您可以拥有多个资源,如预订单、订单、主管

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中使用动词要好

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

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

我将向您建议一种不同的方法,但我不确定它是否能够满足您的系统需求,但也许它可以为您提供一些有用的想法。在您的情况下,您可以拥有多个资源,如预订单、订单、主管

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中使用动词要好