【发布时间】:2015-10-26 12:57:13
【问题描述】:
我正在努力思考如何处理 REST 中的关系。
我已阅读此question。
如果我的 api 中有 Drivers 和 Cars 并且 Driver 只有在连接到 Car 时才能存在> 我会让 Drivers 成为 Cars 中的子资源。 Car 和 Driver 之间的关系包含一组属性,例如 averageSpeed 和 timeOnTheRoad。一辆汽车可以有多个司机,但一个司机只能有一辆汽车。
我应该如何添加新的驱动程序?我应该如何添加司机和汽车之间的关系?
如果我添加一个资源 Wunderbaums,它不是 Cars 的子资源,但 Car 可以包含 Wunderbaums。我应该如何在 Car 和 Wunderbaum 之间添加关系?
在两个实体之间添加关系的一种方法是 POST 到 /entityA/{id}/entityB/{id} 并在正文中发送关系的属性。这适用于我的 Cars 和 Wunderbaums 示例,因为 Wunderbaums 不是 Cars 的子资源,但它会在我的 Cars 和 Drivers 示例中不起作用,因为它会干扰 Drivers 的 CRUD 功能。路径 cars/{id}/drivers{id} 与创建 Car 和 Driver 之间的关系与创建 Driver 的关系相同。
我还发现了 this 关于该主题的未回答问题。
编辑 1
@JB Nizet 建议我将关系属性放在 Driver 中,因为它是一对多关系。这将是一个可能的解决方案,但是如果 Driver 可以拥有许多 Cars 怎么办?我们应该处理与多对多关系不同的一对多关系吗?
编辑 2
我们也可以将关系属性与 Driver 放在多对多关系场景中。那么问题是如果 Driver 有自己的资源,那么cars/2/drivers/4 返回的属性集与drivers/4 是否可以?如果我通过与 Car 的关系获得 Driver,我将在响应中包含 avrageSpeed 和 timeOnTheRoad。
【问题讨论】:
-
它会干扰驱动程序的 CRUD 功能 - 你能澄清一下吗?
-
我更新了我的答案。问题是创建关系的路径与创建
Driver的路径相同,这是不可能的。 -
太棒了!那么,为什么不添加一个单独的端点来管理汽车(
/cars/)、司机(/drivers/)和一个用于建立彼此之间关系的端点/cars/{carID}/drivers/或/drivers/{driverID}/cars/? -
因为
Driver只有连接到Car才能存在,所以我把它设为Cars的子资源。这可能是错误的......但你应该能够从我的 api 获得Driver的唯一方法是通过Car。 -
那么问题出在哪里?您说:路径 cars/{id}/drivers{id} 与创建 Car 和 Driver 之间的关系与创建 Driver 相同:这是怎么回事?司机不能离开汽车而存在,因此每次创建司机时,都必须创建司机与其汽车之间的关系。
标签: rest jax-rs restful-url restful-architecture