gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:03:46 25 4
gpt4 key购买 nike

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

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

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

使用Spring Boot,我在对应关系中设置了两个实体,并且每个实体在指定的基本路径/api上都有自己的端点。

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

如果我创建一个新订单,它的路径为 api/orders/1,它表明在 api/orders/1/items 中也引用了一个项目列表。但是,如果我尝试将新项目发布到该 url,则它不起作用。

我还尝试在 url api/items 上创建一个新项目,这可行,但此时我不知道如何将项目的父项设置为订单.

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

感谢您的帮助。

最佳答案

简短回答:使用订单 URL 作为引用 POST 到/items:

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

长篇大论的回答:通俗地说,“REST”是指通过 HTTP 提供 Web 服务的松散架构风格。有很多最佳/常见做法,但规则并不多。一些存在的规则通常被忽略/破坏。从技术上讲,这些规则来自 original paper如果您忽略他们,有些人会告诉您服务不是 RESTful,因为 REST 有一个精确的定义。

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

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

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 以及获取映射。

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

订单表不应存储任何商品 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 是另一个类,其中仅包含创建项目所需的字段,包括订单 ID。

附言我猜在某些时候你会使用 database for persistence在这种情况下,您可以使用 @ManyToOne and @OneToMany映射。

关于java - 如何使用 REST API 将子对象添加到父对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com