如何处理 REST api 中的关系

Posted

技术标签:

【中文标题】如何处理 REST api 中的关系【英文标题】:How to handle relationships in a REST api 【发布时间】:2015-10-26 12:57:13 【问题描述】:

我正在努力思考如何处理 REST 中的关系。

我已阅读此question。

如果我的 api 中有 DriversCars 并且 Driver 只有在连接到 Car 时才能存在> 我会让 Drivers 成为 Cars 中的子资源。 CarDriver 之间的关系包含一组属性,例如 averageSpeedtimeOnTheRoad。一辆汽车可以有多个司机,但一个司机只能有一辆汽车

我应该如何添加新的驱动程序?我应该如何添加司机和汽车之间的关系?

如果我添加一个资源 Wunderbaums,它不是 Cars 的子资源,但 Car 可以包含 Wunderbaums。我应该如何在 CarWunderbaum 之间添加关系?

在两个实体之间添加关系的一种方法是 POST 到 /entityA/id/entityB/id 并在正文中发送关系的属性。这适用于我的 CarsWunderbaums 示例,因为 Wunderbaums 不是 Cars 的子资源,但它会在我的 CarsDrivers 示例中不起作用,因为它会干扰 Drivers 的 CRUD 功能。路径 cars/id/driversid 与创建 CarDriver 之间的关系与创建 Driver 的关系相同。

我还发现了 this 关于该主题的未回答问题。

编辑 1 @JB Nizet 建议我将关系属性放在 Driver 中,因为它是一对多关系。这将是一个可能的解决方案,但是如果 Driver 可以拥有许多 Cars 怎么办?我们应该处理与多对多关系不同的一对多关系吗?

编辑 2 我们也可以将关系属性与 Driver 放在多对多关系场景中。那么问题是如果 Driver 有自己的资源,那么cars/2/drivers/4 返回的属性集与drivers/4 是否可以?如果我通过与 Car 的关系获得 Driver,我将在响应中包含 avrageSpeedtimeOnTheRoad

【问题讨论】:

它会干扰驱动程序的 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 中的关系的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Flux 应用程序中的关系?

您如何处理 REST API 服务器中的高吞吐量函数?

如何处理 Redux 中的关系数据?

如何处理数据仓库中的图关系?

我应该如何处理 RESTful API 中的对象层次结构?

如何处理mongodb中的多对多关系