我想知道如何设计RESTFUL api来一次创建资源及其相关资源。
例如,我想使用我的RESTFUL API创建一个包含项目列表的订单,例如:
{
order_id:1,
description: "XXX",
items: [
{item_id:1, price:30, ...},
{item_id:2, price:40, ...}
]
}
一种方法是提供两个api
api/orders
=>创建新订单并返回订单ID api/orders/id/items
=>使用order_id创建相关项目但是,订单和项目应一起创建。因此,如果第二个api失败,它将创建一个没有任何物品的订单,这是我不想看到的情况。实际上,我希望后端服务器立即执行事务并创建订单和项目,所以应该一起成功或失败。
因此,将项目放在请求正文中并仅将一次发布到api/orders
上是一个好方法吗?还是针对这种情况还有其他更好的设计?
谢谢!
答案 0 :(得分:2)
当然,创建没有项目的订单-不好的主意。最终将产生不稳定的API和不一致的实体。另外,您无法使用api/orders
URI 创建项目,因为这违反了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足以在后端创建订单项绑定。
答案 1 :(得分:1)
我想知道如何设计RESTFUL api来一次创建资源及其相关资源。
完全合理的事情。集中精力于如何向客户描述如何创建适当的请求,以及如何解释描述结果的文档。
线索在于201 Created状态代码的定义
状态为201(已创建)的状态代码表示请求已完成,并且已创建一个或多个新资源。 201响应有效负载通常描述并链接到创建的资源。
(添加了重点)
在网络上,我们要做的是拥有一个表格;客户将以表格形式提供信息并提交。浏览器遵循表单处理标准,将生成POST(因为语义不安全)请求,其中表单数据编码在消息正文中,并且在标头中定义了适当的内容类型(例如application/x-www-form-urlencoded
)。
相应地,响应将是一个HTML文档,其中包含一堆指向所有已创建的有趣资源的链接。
必须是HTML吗?不,当然不是-如果您需要,可以使用text/plain
。使用内置的媒体类型时,您会有更好的长期前景,通用组件可以理解的链接概念。