Restful集合-如何删除或删除项

Restful集合-如何删除或删除项,rest,Rest,我读了很多关于RESTfulAPI设计的东西。 但是当涉及到实现时,就不再那么容易了。 我遇到了以下问题: 假设以下两个端点: /api/v1/users/:id /api/v1/users/1/friends/:id 正如我们所看到的,朋友是资源用户的集合。 用户的friendslist中可以有n个朋友(按照标准,这是多对多,但现在,让我们假设这是一对多)。 好的,现在我想通过执行以下HTTP请求从用户1的friendslist中删除一个用户(id=3): 删除api/v1/users/1/f

我读了很多关于RESTfulAPI设计的东西。 但是当涉及到实现时,就不再那么容易了。 我遇到了以下问题:

假设以下两个端点:

  • /api/v1/users/:id
  • /api/v1/users/1/friends/:id
  • 正如我们所看到的,朋友是资源用户的集合。 用户的friendslist中可以有n个朋友(按照标准,这是多对多,但现在,让我们假设这是一对多)。 好的,现在我想通过执行以下HTTP请求从用户1的friendslist中删除一个用户(id=3):

    删除api/v1/users/1/friends/3

    这就是我被卡住的地方-要么请求删除id=3的整个用户资源,要么从集合中删除资源。因为我认为两者都是有效的Restful实现

    因此,问题是: 如何在不删除原始资源的情况下从集合中删除项目

    我希望这个问题不会重复——但我用谷歌搜索了很多次才找到答案。也许我不知道相关的技术术语,可以找到一些令人满意的结果


    感谢转发。

    REST方法看起来不错,但实际上只涉及路径格式和HTTP谓词。问题一定出在您的应用程序代码或应用程序路由中。

    我认为最好使用DELETE api/v1/users/1/friends/3删除用户3,就像使用DELETE api/v1/users/1删除用户1一样

    要仅删除用户3作为用户1的朋友,我将使用DELETE api/v1/users/1/friends,并指定一个过滤器,以仅删除id为3的朋友

    删除api/v1/users/1/没有筛选器的朋友将删除用户1的所有朋友


    同样地,要添加用户1的朋友,我将使用PUT api/v1/users/1/friends并指定要添加的朋友的ID。

    因此要清楚:上面的删除方法应该只从集合中删除指向其他资源的链接。链接的资源本身将保持不变。这是真的吗?是的,这是有道理的。您应该只删除好友关系状态,而不是用户/1或由/friends/3表示的用户,而是仅删除两者之间的关系。如果你有一个用户表和一个朋友表,其中有用户_1和用户_2字段,那么只有朋友表会受到影响。我一直认为删除集合也会删除链接的资源。那是我的错。。。。我觉得这事太复杂了。。。现在这只是一个简单的答案,让我明白了一切。非常感谢你!但为了完成这一点:要删除链接资源本身,我必须让所有的朋友返回许多指向用户资源的链接,然后在其中一个链接上调用DELETE,该链接实际上指向特定的资源。我认为这是正确的方法。谢谢你,伙计!这实际上取决于应用程序代码和依赖性。如果对象是父资源所拥有的对象,那么删除它是有意义的,如果它是一个关系,那么只有关系应该被销毁,因为rest端点代表一个关系,而不是它所指向的主要对象。同样,任何这些都可以由控制器代码更改。希望这能让事情变得明朗一点。例如。。。员工:联系人信息=1:m。如果我删除员工,联系人信息也可以删除,因为它取决于员工。是的,这就清楚了;-)非常感谢!你为什么问“如何删除”?如果您问“我是否应该使用像这样的URI来删除集合中的项目而不删除原始资源?”我会回答“是的,看起来非常RESTful”。这是你的问题吗?对不起,我是RESTful实现的新手——正如我在下面所评论的,我一直认为删除集合会删除链接和/或删除原始资源。因此,我不确定如何在集合上实现删除。但正如勘误表所说,在集合的上下文中,DELETE方法只是删除链接。它不会影响原始资源。这就是关键!;-)这根本没有道理。。。为什么应用于/friends的动词处理的是朋友关系而不是实际用户,而应用于/friends/3的动词处理的是用户而不是朋友关系?DELETE/friends/3删除用户之间的关系(因为这是/friends所代表的)而不是实际用户之间的关系更有意义,因为您是在/friends not/users下访问它的。如果你想删除一个用户,那么delete应该应用于实际的用户资源(/users/3),这是我们不同意的,也是这篇文章所要求的。显然,我们都同意DELETE api/v1/users/1将用于删除用户1。正如这篇文章所指出的,朋友可以被视为用户的集合,就像用户可以被视为用户的集合一样。如果您使用用户集合/3,那么这将是指一个用户。在我使用的大多数api中,api/v1/users/1/friends/3都是指用户。我也看到了你的思维方式,朋友指的是关系的集合,这对某些人来说也是有意义的。api/v1/users/1/friends是用户的集合,但该集合与api/v1/users/1有关系,所以当你从api/v1/users/1/friends中删除任何内容时,您只是从api/v1/users/1/friends集合中删除它,而不是从api/v1/users集合中删除它。您没有从整个API中删除根用户,因为您没有从API/users资源中删除用户。用户将从api/v1/users/1/friends集合中消失,但仍存在于api/v1/users集合中。按照您的想法,DELETE api/v1/users/1删除用户,DELETE api/v1/users/1/friends/3从集合中删除用户。你是