设计一个RESTful api,用于立即创建资源及其相关资源

设计一个RESTful api,用于立即创建资源及其相关资源,rest,api,post,one-to-many,orders,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 post:api/orders=>创建新订单并返回订单id p

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

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

{
    order_id:1,
    description: "XXX",
    items: [
        {item_id:1, price:30, ...},
        {item_id:2, price:40, ...}
    ]
}
一种方法是提供两个api

  • post:
    api/orders
    =>创建新订单并返回订单id
  • post:
    api/orders/id/items
    =>使用订单id创建相关项目
  • 但是,订单和项目应该一起创建。因此,如果第二个api失败,它将创建一个内部没有任何项目的订单,这是我不想看到的情况。实际上,我希望后端服务器执行一个事务并立即创建订单和项目,它应该是成功的还是失败的

    那么,将项目放入请求主体中,并且只向
    api/orders
    发布一次,这是一种好方法吗?还是有其他更好的设计来应对这种情况


    谢谢大家!

    当然,创建没有物品的订单是个坏主意。这将导致不可靠的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
      }
    
    POST-api/item
    {
    价格:40,
    名称:“xxx”,
    ...
    }
    我想知道如何设计一个RESTFUL api来同时创建资源及其相关资源

    做一件完全合理的事。将注意力集中在如何向客户描述如何创建适当的请求,以及如何解释描述结果的文档上

    线索在201创建状态代码的定义中

    201(已创建)状态代码表示请求已完成,并导致创建一个或多个新资源。 201响应有效载荷通常描述和链接到所创建的资源

    (增加重点)

    在网络的情况下,我们会这样做的方式是有一个表单;客户将在表格中提供信息并提交。遵循表单处理标准的浏览器将生成一个POST(因为语义不安全)请求,其中表单数据编码在消息体中,相应的内容类型定义在消息头中(例如
    application/x-www-form-urlencoded

    用术语来说,响应将是一个HTML文档,其中包含一组指向所创建的所有感兴趣资源的链接


    它必须是HTML吗?不,当然不是-如果适合您的需要,您可以使用
    text/plain
    。当使用内置了通用组件可以理解的链接概念的媒体类型时,您的长期前景会更好。

    您不能使用api/orders URI创建项目,因为这违反了REST原则的基础。您能解释一下吗?