什么是实现多对多关系的最佳方式,包含meta,RESTfully?

时间:2014-02-26 15:54:29

标签: http rest many-to-many metadata

当通过RESTful接口表示数据模型时,可以理解创建与一个类型/对象组相关联的顶级端点:

  • /用户
  • /汽车

我们可以重新使用HTTP谓词来启用对这些组的操作(GET列表,POST创建等)。当表示具有“依赖性”的模型(即没有“父”时它不能存在)时,我们可以创建更深的端点来表示依赖关系:

  • /用户/ [:ID] /令牌

在这种情况下,没有/tokens的顶级端点是有意义的,因为它们不应该在没有用户的情况下存在。

多对多关系变得有点棘手。如果两个模型可以具有多对多关系但也可以真正存在,那么为两个对象提供顶级端点和更深端点来定义关系是有意义的:

  • /用户
  • /汽车
  • /用户/ [:ID] /汽车
  • /汽车/ [:ID] /用户

然后我们可以使用 PUT DELETE 方法通过HTTP接口定义这些关系:PUT /users/[:user_id]/cars/[:car_id]。运行 PUT 操作会创建一个以某种方式链接两个对象的数据模型(如关系数据库中的连接表)。


然后,棘手的部分决定在何处限制界面以对抗冗余。

您是否允许对第二级深端点(GET /users/[:user_id]/cars/[:car_id])发出 GET 请求?或者您是否要求他们从顶级GET /cars/[:id]访问“汽车”?

现在,如果多对多关系包含元信息怎么办?你是如何表达的,你在哪里归还它?

例如,如果我们想跟踪用户驾驶某辆汽车的次数怎么办?我们在哪里返回这些信息?如果我们在嵌套端点返回它,如果我们返回元信息而不是资源,我们是违反REST还是不一致?我们是通过某种属性将元信息嵌入到请求的资源中吗?

请指教。 :P(但是真的,谢谢)

2 个答案:

答案 0 :(得分:3)

您可以创建新资源。类似users/[:user_id]/cars/[:car_id]/stats的内容,其回复包含{drivings_count: 123}。你可能只允许这个资源的GET。

答案 1 :(得分:3)

此时恕我直言,这更像是个人设计偏好。

我个人会选择停在/ users / [:user_id] / cars /,然后要求拨打/ cars / [:car_id]来获取汽车信息。

如果您要包含特定于关系的元数据,例如“用户驾驶某辆车多少次?”将它保持在像/ users / [:user_id] / cars / [:car_id]这样更深层的关系中是有意义的。

说实话,这不是一门精确的科学。你必须做最简单,最具表现力但仍然足够强大的数据模型。