如何使用 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 映射。
抱歉,如果这个问题看起来很奇怪,我是 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 映射。