Web services 在REST中添加/删除多对多关系的正确方法是什么?

Web services 在REST中添加/删除多对多关系的正确方法是什么?,web-services,http,rest,many-to-many,Web Services,Http,Rest,Many To Many,假设我们有一个实体,其中包含服务器上的用户列表,我们希望将其公开为rest。正确的方法是什么 我的第一个猜测是这样的: /entity/1/user/5 {"entityID":1,"name":"whatever","users":[1,2,3,4,5]} 我们可以使用PUT进行更新,使用DELETE进行删除 是这样吗?我去了维基百科,在那里它谈到了rest,而他们的观点是,所有的东西都只有一个层次的深度。因此,他们可能希望您使用PUT/POST并给出整个JSON图,同时更新整个内容?我对

假设我们有一个实体,其中包含服务器上的用户列表,我们希望将其公开为rest。正确的方法是什么

我的第一个猜测是这样的:

/entity/1/user/5
{"entityID":1,"name":"whatever","users":[1,2,3,4,5]}
我们可以使用PUT进行更新,使用DELETE进行删除


是这样吗?我去了维基百科,在那里它谈到了rest,而他们的观点是,所有的东西都只有一个层次的深度。因此,他们可能希望您使用PUT/POST并给出整个JSON图,同时更新整个内容?

我对父/子实体使用您的方法,但对于多对多,我在JSON对象中使用表示该实体的数组

以你的例子来说:

GET /entity/1
将返回一个实体对象,如下所示:

/entity/1/user/5
{"entityID":1,"name":"whatever","users":[1,2,3,4,5]}
PUT将传入同一个对象,并更新实体和用户。然后,要获取特定的用户信息:

GET /users/3

使用PUT on users/3将更新用户。打开/entity/1将用户连接到实体。不幸的是,关于如何对这类事情进行建模,没有太多好的信息。

您的示例是一种非常有效的方法。 然而,在许多情况下,
用户
可以仅存在于
实体
的上下文之外。我倾向于单独识别资源,例如:

/entity/1
/user/5
要查看与实体关联的用户,我将使用:

/entity/1/users
可以通过发布用户来添加用户

POST /entity/1/users
<User>
...
</User>
更新或创建用户可以通过PUT完成

PUT /User/6
删除用户和实体之间的关联需要一些创造性。你可以

DELETE /Entity/1/User/5 
按照你的建议,或者类似的

DELETE /Entity/1/UserLink?UserId=5
或者只是

DELETE /Entity/1/Users?UserId=5

对于API的用户来说,URI的外观并不重要。为了您自己的理智保持一致是很好的,选择易于与您的服务器框架一起调度的方案是很好的,但重要的不是URI的外观,而是您如何处理它们

你所说的实体是什么意思,这是rest api>@Rahul Mehta:entity作为一个业务对象,如“hotel”、“club”、“question”等。你可以尝试类似OData Hrm的东西。。。我已经为各个实体设置了/entity/x和/user/x。你的方法不是有点低效吗?如果我想向一个实体添加一个新用户,我必须获取当前的用户列表,附加一个,然后将整个列表发回。这真的是标准的方法吗?听起来很奇怪。。。但我想我不会把它放在那些制定这些标准的人面前;)不,这不是标准,只是我想出来的。解析表非常简单和狭窄,每当父实体被修改时,我总是清除并重新创建记录。在我看来,简单胜过低效。我唯一不会这样做的情况是,如果同一个实体经常被编辑,使其具有相关性。感谢所有的方法。我认为你的帖子很有帮助,因为它证实了我当时所做的是正确的。例如,当我单独使用它们时,我确实有/entity/1和/user/5。。。我只是在处理多对多收集箱时遇到了麻烦。正如您所说,对于删除,您几乎被迫执行类似于/entity/1/user/5的操作。因为我事先知道身份证是什么。。。实际上,写一篇帖子并不容易,我可以保持我的添加/删除URL不变,我认为这会增加理智;)谢谢你的回答。