如何处理REST API

时间:2015-10-26 12:57:13

标签: rest jax-rs restful-url restful-architecture

我试图了解如何处理REST中的关系。

我已阅读此question

如果我的api中有驱动程序汽车,并且驱动程序只有在连接到汽车时才会存在>我会在 Cars 中将 Drivers 作为子资源。 Car 驱动程序之间的关系包含一组属性,例如averageSpeedtimeOnTheRoad。一个 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 的关系获得驱动程序,我会在响应中包含avrageSpeedtimeOnTheRoad

1 个答案:

答案 0 :(得分:0)

从DDD的角度来看,我想也许你问错了问题;问题不在于“数据库中的汽车和驱动程序如何相关,因此它们应该如何在API中显示”,而是“我的API会暴露哪些功能以及它支持哪些行为”?

换句话说,每个REST API在业务环境(或用户的心灵)中调用意味着是什么意思?如果请求是“我开的车是什么?”然后是司机 - >> car是该API调用的关系。如果请求是“指定Tim驾驶小型货车”,那么该API调用的关系是Driving - >驱动器,汽车

使用REST构建CRUD系统可以正常工作,但听起来你想要的是超越它的一步。