我试图了解如何处理REST中的关系。
我已阅读此question。
如果我的api中有驱动程序和汽车,并且驱动程序只有在连接到汽车时才会存在>我会在 Cars 中将 Drivers 作为子资源。 Car 与驱动程序之间的关系包含一组属性,例如averageSpeed
和timeOnTheRoad
。一个 Car 可以有多个驱动程序,但驱动程序只能有一个 Car 。
我应该如何添加新驱动程序?我该如何在司机和汽车之间添加关系?
如果我添加资源 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 之间的关系相同。
我还在这个问题上找到了this未回答的问题。
编辑1
@JB Nizet建议我将关系属性放在 Driver 中,因为它是一对多的关系。这将是一个可能的解决方案,但如果驱动程序可能有很多汽车怎么办?我们应该处理不同于多对多关系的一对多关系吗?
编辑2
我们也可以在多对多关系场景中将关系属性与驱动程序放在一起。那么问题是如果 Driver 有自己的资源,cars/2/drivers/4
是否可以返回一组不同于drivers/4
的属性?如果我通过与 Car 的关系获得驱动程序,我会在响应中包含avrageSpeed
和timeOnTheRoad
。
答案 0 :(得分:0)
从DDD的角度来看,我想也许你问错了问题;问题不在于“数据库中的汽车和驱动程序如何相关,因此它们应该如何在API中显示”,而是“我的API会暴露哪些功能以及它支持哪些行为”?
换句话说,每个REST API在业务环境(或用户的心灵)中调用意味着是什么意思?如果请求是“我开的车是什么?”然后是司机 - >> car是该API调用的关系。如果请求是“指定Tim驾驶小型货车”,那么该API调用的关系是Driving - >驱动器,汽车
使用REST构建CRUD系统可以正常工作,但听起来你想要的是超越它的一步。