REST API,每个资源有多个命令

Jun*_*per 10 api rest http

我有一个关于REST API设计的问题.这是一个简单的(可能太简单)API:

GET /ecommerce/order/123

POST /ecommerce/order (create a new order)

PUT /ecommerce/order/123 (update an existing order)

DELETE /ecommerce/order/123 (cancel order)
Run Code Online (Sandbox Code Playgroud)

但是,如果我希望客户输入订单被取消的原因怎么办?我需要将发布数据发送到API,但这不适用于DELETE.为了迎合这一点,我必须将DELETE更改为PUT.然后我会发布两个不同的资源进行更新和取消.

另一种解决方案是更改API:

GET /ecommerce/order/123

POST /ecommerce/order/create (create a new order)

PUT /ecommerce/order/update/123 (update an existing order)

DELETE /ecommerce/order/cancel/123 (cancel order)
Run Code Online (Sandbox Code Playgroud)

我不确定哪个是最好的选择.

关于REST API如何处理单个资源的多个命令有一个更普遍的问题.

任何输入将不胜感激!我很快就会在练习中阅读REST,但这个问题正在扼杀我.

Rob*_*ska 6

一种选择可能是创建新资源.CancelledOrder, 也许.

你可能会有POST一个新的CancelledOrder:

POST /ecommerce/cancelledOrder
Entity:
    order: /ecommerce/order/123
    reason: "Problem with order"
Run Code Online (Sandbox Code Playgroud)

您也/替代可能PUTCancelledOrder:

PUT /ecommerce/cancelledOrder/123
Entity:
    reason "Problem with order"
Run Code Online (Sandbox Code Playgroud)

然后,应用程序可以删除订单123或将其状态更新为"已取消",或执行您的业务规则要求的任何操作.最重要的是,你可以不DELETE直接支持该方法/ecommerce/order/N,返回一个405 Method Not Allowed.

PUT解决方案可以使用幂等它的优势; PUTCancelledOrder多次将永远仍然导致订单被取消.

应该注意的是,您更改API的建议(例如/ecommerce/order/create)可能不是RESTful,因为您在资源标识符中定义方法.