rest - 设计一个 RESTful api,用于一次创建资源及其相关资源

标签 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. post: api/orders => 创建一个新订单并返回订单id
  2. post: api/orders/id/items => 使用 order_id 创建相关项目

但是,订单和项目应该一起创建。因此,如果第二个 api 失败,它将创建一个没有任何项目的订单,这是我不想看到的情况。其实我是想让后台服务器做一个事务,一次性创建订单和商品,应该一起成功或者一起失败。

那么,将项目放在请求正文中,并且只向 api/orders 发送一次是不是一种好方法?或者对于这种情况还有其他更好的设计吗?

谢谢!

最佳答案

I want to know how to design a RESTFUL api for creating a resource and its related resources at once.

非常合理的事情。将注意力集中在如何向客户描述如何创建适当的请求,以及如何解释描述结果的文档。

线索在201 Created状态码的定义中

The 201 (Created) status code indicates that the request has been fulfilled and has resulted in one or more new resources being created. The 201 response payload typically describes and links to the resource(s) created.

(强调)

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

在术语中,响应将是一个 HTML 文档,其中包含指向所有已创建的有趣资源的链接。

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

关于rest - 设计一个 RESTful api,用于一次创建资源及其相关资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58552114/

相关文章:

ruby-on-rails - 在这种情况下如何命名 RESTFUL 资源

jquery - 使用 JQuery 将对象传递给 WCF 服务

php - 我将如何通过 REST API 处理游戏操作?

Javascript Rest API 在 for 循环中获取调用而不为元素设置值

json - 如何使用 Alamofire 4.0 发出 POST 请求并且参数是文本而不是 json

.net - rabbitmq 的 REST API

java - 如何使用 junit 测试带有 MultiPart 参数的 REST API?

python - ctypes 上的 PyObject_Str 段错误通过了字典

python - 使用 Python 3 的 HTTP Post 请求

c# - 在 C# 中构建 POST