rest_REST:管理多对多关系

rest

rest

介绍

管理多个资源之间的关系可能是RESTful API的重要组成部分。 在这篇文章中,我们将看到使用REST API可以管理多少对许多关系。

我们以一个简单的用户/关系为例。 假设用户和组是两个单独的资源(例如/ users/ groups ),并且我们想提供一种方法来管理以下几点所描述的关系:

  • 可以将一个用户添加到多个组
  • 一个组可以包含多个用户
  • 用户只能添加一次到组

多对多关系可以分为两种不同的类型:

  • 除实际关系外,没有其他信息的关系
  • 包含其他数据的关系。 在我们的例子中可以像一组成员状态(例如,用户是在一个主持人和一个简单的成员在另一)

在本文中,我们将仅讨论第一种类型的关系。 与其他数据的关系将在以后的帖子中介绍。

当然,没有单个正确的解决方案可以解决此问题。 下一节将介绍我获得最佳经验的方法。 之后,我们将看一些替代解决方案。

建模子资源和GET操作

首先,我们介绍两个子资源:

  • / users / <用户ID> / groups代表分配给ID为<用户ID>的用户的组
  • / groups / <group-id> / users代表分配给ID为<group-id>的组的用户

现在,使用GET动词可以请求两个集合。

将用户分配到特定组:

GET /groups/<group-id>/users

获取分配给特定用户的组:

GET /users/<user-id>/groups

添加和删​​除用户

现在,我们需要一种将用户添加到组的方法。 我们使用PUT动词执行此操作。

将用户添加到组:

PUT /groups/<group-id>/users/<user-id>

此操作不需要请求正文。

例如,这将用户32添加到组21中

PUT /groups/ 21 /users/ 32

请注意,在这里我们需要问一个问题:是否将用户添加到组是幂等的。 在我们的示例中,此操作是幂等的:用户只能添加一次到组中。 因此,我们使用PUT动词。 如果分配操作不是幂等的(例如,可以将一个用户多次添加到一个组中),我们必须使用POST而不是PUT。

在我的其他文章中,您可以阅读有关幂等性以及POST和PUT之间区别的更多信息。

或者,我们也可以根据需要从/ users角度对该操作进行建模。

向用户添加组:

PUT /users/<user-id>/groups/<group-id>

要从组中删除用户,我们使用DELETE动词。

从组中删除用户:

DELETE /groups/<group-id>/users/<user-id>

例如,这将用户32从组21中删除:

DELETE /groups/ 21 /users/ 32

反之亦然,从/ users一侧开始:

从用户删除组:

DELETE /users/<user-id>/groups/<group-id>

请注意,尽管我们在/ groups / <group-id> / users / <user-id>上执行PUT和DELETE操作,但无需为此URI实现GET。 GET / groups / 21 / users / 32只会返回与GET / users / 32相同的结果(只要用户是给定组的一部分)

替代解决方案

引入单独的

另一种方法是创建一个完全独立的资源来管理用户之间的关系。

用户添加到可能如下所示:

 POST /group-members
 {

    groupId: 31 ,

    userId: 23
 }

为了将用户分配到给定的,我们可以使用与先前解决方案类似的请求:

GET /groups/<group-id>/members

但是,这一次它将返回一个组成员资源列表。

这种方法增加了一些复杂性(我们添加了一个可能具有其自身标识符的全新资源)。 但是,如果我们想向关系中添加一些其他信息(例如,用户加入日期),则该功能特别有用。 在以后的文章中,我们将详细研究与其他数据之间的关系。

作为正常资源更新的一部分管理关系

另一种方法是使用标准更新操作来管理关系。 例如:

 PUT /users/ 23
 {

    "name" : "John" ,

    "groups" : [

        { "id" : "42" },

        { "id" : "43" }

    ]
 }

尽管这在某些情况下可以正常工作,但我不推荐这种方法。

资源和关系经常相互独立地进行更改。 将两个操作合并在一起可能会导致各种问题。 例如,从安全角度来看,两个操作可能需要不同的权限。 可能允许客户端将用户添加到组中,但可能无权更新用户本身。

由于存在很多关系,这种方法对性能也很麻烦。 因此,通常最好提供单独的操作来更新资源和关系。

翻译自: https://www.javacodegeeks.com/2020/06/rest-managing-many-to-many-relations.html

rest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值