我想知道如何设计一个RESTFUL api来一次创建资源及其相关资源。
例如,我想使用我的RESTFUL API创建一个包含项目列表的订单,例如:
{
order_id:1,
description: "XXX",
items: [
{item_id:1, price:30, ...},
{item_id:2, price:40, ...}
]
}
一种方法是提供两个api
api/orders
=>创建新订单并返回订单IDapi/orders/id/items
=>使用order_id创建相关项目但是,订单和商品应一起创建。因此,如果第二个api失败,它将创建一个没有任何物品的订单,这是我不想看到的情况。实际上,我希望后端服务器立即执行事务并创建订单和项目,所以应该一起成功或失败。
因此,将项目放入请求正文中,并且仅将其发布到api/orders
上是一个好方法吗?还是针对这种情况还有其他更好的设计?
谢谢!
肯定是创建没有项目的订单-好主意。最终将产生不稳定的API和不一致的实体。另外,您不能使用api/orders
URI create项目,因为这违反了REST原则的基础。
对于您的业务逻辑,REST API可能看起来像:
POST api/item
{
price: 40,
name: "xxx",
...
}
<<<<< 201
{
id: 1
}
GET api/item/{id}
<<<<< 200
{
id: 4,
price: 40,
name: "xxx",
...
}
POST api/order
{
description: "xxx",
items: [
{id: 1, count: 5},
{id: 23456, count: 1}
]
}
<<<<< 201
{
id: 123442
}
我认为没有必要在创建订单请求正文时放入完整的项目。商品ID足以在后端创建订单商品绑定。