Dav*_*erg 6 rest jax-rs restful-url restful-architecture
我试图了解如何处理REST中的关系.
我读过这个问题.
如果我有司机和汽车在我的API和驱动程序如果连接到一个只能存在车我会让司机在子资源汽车.Car和Driver之间的关系包含一组属性,比如说averageSpeed
和timeOnTheRoad
.一辆车可以有很多司机,但司机只能有一辆车.
我该如何添加新驱动程序?我该如何在司机和汽车之间添加关系?
如果我添加一个资源Wunderbaums,它不是汽车的子资源,但Car可以包含Wunderbaums.我该如何在Car和Wunderbaum之间添加关系?
在两个实体之间添加关系的一种方法是POST /entityA/{id}/entityB/{id}
并发送正文中关系的属性.这可以用于我的汽车和Wunderbaums示例,因为Wunderbaums不是汽车的子资源,但它在我的汽车和驾驶员示例中不起作用,因为它会干扰驾驶员的 CRUD功能.路径cars/{id}/drivers{id}
将创建之间的关系同样车和驱动程序作为创建驱动程序.
我还发现了关于这个问题的未解决的问题.
编辑1
@JB Nizet建议我把关系属性放在Driver里面,因为它有一对多的关系.这将是一个可能的解决方案,但如果一个司机可以有很多车怎么办?我们应该处理不同于多对多关系的一对多关系吗?
编辑2
我们也可以在多对多关系场景中将关系属性与驱动程序放在一起.那么问题是如果Driver有自己的资源,是否可以cars/2/drivers/4
返回一组不同的属性drivers/4
?在我得到的情况下驱动程序通过它关系到汽车,我会包括avrageSpeed
与timeOnTheRoad
在响应中.
从 DDD 的角度来看,我认为您可能问了错误的问题;问题不是“汽车和驾驶员在数据库中如何关联,因此它们应该如何在 API 中体现”,而是“我的 API 公开了哪些功能以及它支持哪些行为”?
换句话说,每个 REST API 调用在业务上下文(或用户的想法)中意味着什么?如果请求是“我开过什么车?” 那么 driver ->> car 就是该 API 调用的关系。如果请求是“分配 Tim 驾驶小型货车”,则该 API 调用的关系是 Driving -> Driver,Car
用 REST 构建 CRUD 系统可以很好地工作,但听起来您想要的还不止于此。