如何处理 REST api 中的关系
Posted
技术标签:
【中文标题】如何处理 REST api 中的关系【英文标题】:How to handle relationships in a REST api 【发布时间】: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/driversid
与创建 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/driversid 与创建 Car 和 Driver 之间的关系与创建 Driver 相同:这是怎么回事?司机不能离开汽车而存在,因此每次创建司机时,都必须创建司机与其汽车之间的关系。
【参考方案1】:
从 DDD 的角度来看,我认为您可能问错了问题;问题不是“汽车和驾驶员如何在数据库中关联,因此它们应该如何在 API 中体现”,而是“我的 API 公开了哪些功能以及它支持哪些行为”?
换句话说,/每个 REST API 调用意味着在业务的上下文中(或用户的想法)是什么?如果请求是“我开过什么车?”那么 driver ->> car 是该 API 调用的关系。如果请求是“指派 Tim 驾驶小型货车”,则该 API 调用的关系是驾驶 -> 司机,汽车
从 REST 构建一个 CRUD 系统可以正常工作,但听起来你想要的只是一个步骤。
【讨论】:
以上是关于如何处理 REST api 中的关系的主要内容,如果未能解决你的问题,请参考以下文章