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

时间:2010-12-23 18:34:21

标签: web-services http rest many-to-many

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

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

/entity/1/user/5

我们可以使用PUT进行更新,使用DELETE进行删除吗?

这是对的吗?我去维基百科谈论休息,他们对它的看法是一切都只有1级深。那么也许他们希望你使用PUT / POST并提供整个JSON图并一次更新所有内容?

2 个答案:

答案 0 :(得分:13)

您的示例是一种非常有效的方法。 但是,在许多情况下,User可能只存在于entity的上下文之外。我倾向于孤立地识别资源,例如:

/entity/1
/user/5

要查看与我将使用的实体关联的用户:

/entity/1/users

添加用户可以通过POST用户来完成,

POST /entity/1/users
<User>
...
</User>

删除用户

DELETE /User/5

可以使用PUT

来更新或创建用户
PUT /User/6

删除用户与实体之间的关联需要一点创造力。你可以做到

DELETE /Entity/1/User/5 

正如您所建议的,或类似

DELETE /Entity/1/UserLink?UserId=5

或只是

DELETE /Entity/1/Users?UserId=5

对于API的用户而言,现实对您的URI看起来并不重要。为了您自己的理智而保持一致是很好的,选择易于使用您的服务器框架进行调度的方案是很好的,但它不是您的URI的样子,而是您使用它们做的重要事项。

答案 1 :(得分:1)

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

所以使用你的例子:

GET /entity/1

会返回一个像这样的实体对象:

{"entityID":1,"name":"whatever","users":[1,2,3,4,5]}

PUT将传入同一个对象,并更新实体和用户。然后获取特定的用户信息:

GET /users/3

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