如何为双向实体映射设计端点

How to design endpoints for bi-directional entity mapping

有两个实体,UserOrderUser 实体有 Set<Order> 个订单,它是一个双向映射。

现在我有两个控制器,一个控制器叫做 OrderController,它有一些端点来检索所有订单等。第二个控制器叫做 UserController,它有一些端点与用户,但它也有端点,例如 /users/{username}/orders/users/{username}/orders/{orderId}.

问题是我应该在哪里添加端点来保存订单?它应该是 OrderController 中的 POST/orders 还是应该在 UserController 中作为 /users/{username}/orders 端点?订单由用户创建,OrderController 仅用于检索所有订单,而不仅仅是针对特定用户。

关于应该如何设计,您有什么建议吗?

Zalando API Guideline 对此事有一些看法,他们建议我们应该限制资源类型的数量,原因如下:

To keep maintenance and service evolution manageable, we should follow "functional segmentation" and "separation of concern" design principles and do not mix different business functionalities in same API definition. In practice this means that the number of resource types exposed via an API should be limited. In this context a resource type is defined as a set of highly related resources such as a collection, its members and any direct sub-resources.

适用于你的情况,基本上他们建议只有以下资源类型:

  • /用户
  • /订单

不需要 /users/{username}/orders/,因为 /orders 已经达到了同样的目的。如果你想获得用户的订单,只需使用 /orders?user=foobar