简答:使用订单 URL 作为参考 POST 到 /items:
curl -X POST -H "Content-Type:application/json" -d '{"name": "foobar", "order": "http://localhost:8080/orders/1"}' http://localhost:8080/items
冗长(-winded) 答案:
通俗地说,“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 和 GetMapping。
关于 API 设计,我建议您使用更扁平的版本,通过 POST 到 /api/items 来创建项目,并且正文中的订单 ID 超过 /api/orders/1/items。这更符合数据库规范化,并且更清楚哪个控制器应该处理哪些请求。
订单表不应存储任何商品 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 映射。