Http 什么';实现多对多关系的最佳方式是什么,它包含元关系、RESTfully关系?

Http 什么';实现多对多关系的最佳方式是什么,它包含元关系、RESTfully关系?,http,rest,many-to-many,metadata,Http,Rest,Many To Many,Metadata,当通过RESTful接口表示数据模型时,可以理解为创建与对象类型/组关联的顶级端点: /使用者 /汽车 我们可以重用HTTP谓词来启用对这些组的操作(获取列表、发布以创建等)。当用“依赖关系”表示模型时(因为没有“父项”它就不可能存在),我们可以创建更深层的端点来表示依赖关系: /用户/[:id]/tokens 在这种情况下,最好不要将顶级端点设置为/tokens,因为如果没有用户,它们就不可能存在 多对多的关系变得更加棘手。如果两个模型可以具有多对多关系,但也可以真正独立存在,则为这两

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

  • /使用者
  • /汽车
我们可以重用HTTP谓词来启用对这些组的操作(获取列表、发布以创建等)。当用“依赖关系”表示模型时(因为没有“父项”它就不可能存在),我们可以创建更深层的端点来表示依赖关系:

  • /用户/[:id]/tokens
在这种情况下,最好不要将顶级端点设置为
/tokens
,因为如果没有用户,它们就不可能存在

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

  • /使用者
  • /汽车
  • /用户/[:id]/cars
  • /cars/[:id]/用户
然后,我们可以使用PUTDELETE方法通过HTTP接口定义这些关系:
PUT/users/[:user\u id]/cars/[:car\u id]
。运行PUT操作将创建一个数据模型,以某种方式链接两个对象(如关系数据库中的联接表),这是有道理的


然后,棘手的部分变成了决定在何处限制接口以对抗冗余

您是否允许对第二级深度端点发出请求(
GET/users/[:user\u id]/cars/[:car\u id]
)?或者您是否要求他们从顶层访问“car”
GET/cars/[:id]

现在,如果多对多关系包含元信息呢?您是如何表示的?您在哪里退回? 例如,如果我们想记录一个用户驾驶某辆汽车的次数,该怎么办?我们将在哪里返回该信息?如果我们在嵌套端点返回它,那么如果我们返回的是元信息而不是资源,我们是违反了REST还是不一致?我们是否通过某种属性将元信息嵌入到请求的资源中


请告知:P(但真的,谢谢)

您可以创建一个新资源。类似于

users/[:user\u id]/cars/[:car\u id]/stats的东西,其响应包括
{drivings\u count:123}
。您可能只允许获取此资源。

在这一点上,这实际上是个人的设计偏好

我个人会选择在/users/[:user\u id]/cars/停车,然后要求打电话到/cars/[:car\u id]获取汽车信息

但是,如果您包含特定于关系的元数据,比如“某个用户驾驶某辆车的次数?”则有必要将其保存在更深层次的关系中,比如/users/[:user\u id]/cars/[:car\u id]


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

可能的重复:@BrianKelly谢谢您,但这并不能回答如何表示返回的模型(元与资源和模型嵌入)这是一个有趣的想法。谢谢这是一个令人敬畏的回应。谢谢你,伙计。你认为在资源中嵌入meta与在深层端点返回meta有什么不同?我会投票支持Jeremy Weiskotten建议的动态方法。可能是基于嵌套动态更改的/meta或/stats。尽管如此,这也是个人对设计的偏好,而不是教条式的REST规范。