设计一个RESTful api,以一次创建资源及其相关资源

时间:2019-10-25 04:14:56

标签: rest api post one-to-many orders

我想知道如何设计RESTFUL api来一次创建资源及其相关资源。

例如,我想使用我的RESTFUL API创建一个包含项目列表的订单,例如:

{
    order_id:1,
    description: "XXX",
    items: [
        {item_id:1, price:30, ...},
        {item_id:2, price:40, ...}
    ]
}

一种方法是提供两个api

  1. 发布:api/orders =>创建新订单并返回订单ID
  2. 发布:api/orders/id/items =>使用order_id创建相关项目

但是,订单和项目应一起创建。因此,如果第二个api失败,它将创建一个没有任何物品的订单,这是我不想看到的情况。实际上,我希望后端服务器立即执行事务并创建订单和项目,所以应该一起成功或失败。

因此,将项目放在请求正文中并仅将一次发布到api/orders上是一个好方法吗?还是针对这种情况还有其他更好的设计?

谢谢!

2 个答案:

答案 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。使用内置的媒体类型时,您会有更好的长期前景,通用组件可以理解的链接概念。