我有一个关于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,但这个问题正在扼杀我.
一种选择可能是创建新资源.CancelledOrder, 也许.
你可能会有POST一个新的CancelledOrder:
POST /ecommerce/cancelledOrder
Entity:
order: /ecommerce/order/123
reason: "Problem with order"
Run Code Online (Sandbox Code Playgroud)
您也/替代可能PUT一CancelledOrder:
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解决方案可以使用幂等它的优势; PUT婷CancelledOrder多次将永远仍然导致订单被取消.
应该注意的是,您更改API的建议(例如/ecommerce/order/create)可能不是RESTful,因为您在资源标识符中定义方法.