如何使用 REST API 将子对象添加到父对象?

How do I add a child object to parent using REST APIs?

抱歉,如果这个问题看起来很奇怪,我是 REST API 的新手!

我有两个实体:订单和项目。

一个订单可以有多个商品,一个商品只能有一个订单。

使用Spring引导,我已经设置了对应关系中的两个实体,并在指定的基本路径上分别有自己的端点/api.

我可以很好地添加订单或项目,但是,我正在尝试弄清楚如何将项目直接添加到订单中。

如果我创建了一个新订单并且它的路径为 api/orders/1,它表明其中也引用了一个项目列表 api/orders/1/items。但是,如果我尝试 POST 一个新项目到那个 url,它不起作用。

我也试过在 url api/items 上创建一个新项目,这很有效,但此时我不知道如何将项目的父级设置为订单。

我也在使用 Postman 来完成这项任务。

感谢您的帮助。

简短回答:POST 到 /items 使用顺序 URL 作为参考:

curl -X POST -H "Content-Type:application/json" -d '{"name": "foobar", "order": "http://localhost:8080/orders/1"}' http://localhost:8080/items

长篇大论的回答: 通俗地说,“REST" refers to a loose architectural style for providing web services over HTTP. There are a lot of best/common practices but there aren't many rules. Some of the rules that exist are commonly ignored/broken. Technically, those rules come from the original paper 如果您忽略服务,有些人会告诉您服务不是 RESTful,因为 REST 有精确的定义。

大多数人在实践中忽略的一个是 HATEOAS,它是客户端应该能够与服务交互并发现所有端点的原则,而无需使用超媒体的任何先验知识。这类似于,作为一个人,您可以浏览到站点的主页并逐页导航,单击链接。

Spring Data REST 提供了一种将数据存储库公开为超媒体驱动服务的简单方法。对其他实体的引用作为 URLs 而不是普通 ID 传递。要创建属于订单的项目,您首先需要订单的 URL。然后你可以post到物品集合:

curl -X POST -H "Content-Type:application/json" -d '{"name": "foobar", "order": "http://localhost:8080/orders/1"}' http://localhost:8080/items

旧答案:

在没有看到任何代码的情况下很难说出了什么问题,但您需要确保端点 /api/order/{id}/items 具有 PostMapping 和 GetMapping。

关于 API 设计,我建议您通过 POSTing 到 /api/items 创建项目,并在 /api/orders/1/items 正文中添加订单 ID .这更符合数据库规范化,并且更清楚哪个控制器应该处理哪些请求。

订单 table 不应存储任何项目 ID。项目条目存储它们的订单 ID。要获取订单中的商品列表,请按订单 ID 过滤所有商品。

POST /api/items
{
  "orderId": 123,
  "skuId": 234,
  "price": 42.10,
  "gift": false
}

POST /api/orders/123/items
{
  "skuId": 234,
  "price": 42.10,
  "gift": false
}

在你的 ItemController 中你可以有类似

的东西
@PostMapping
public Item createItem(@RequestBody ItemRequestDTO) {
...
}

ItemRequestDTO 是另一个 class,其中仅包含创建项目所需的字段,包括订单 ID。

P.S。我猜你会在某个时候使用 database for persistence in which case you can use @ManyToOne and @OneToMany 映射。