Как правильно добавить / удалить отношения «многие ко многим» в REST? - PullRequest
14 голосов
/ 23 декабря 2010

Допустим, у нас есть объект, который содержит список пользователей на сервере, и мы хотим выставить это как остальные.Как правильно это сделать?

Мое первое предположение примерно такое:

/entity/1/user/5

Мы можем использовать PUT для обновлений и DELETE для удалений?это право?Я пошел в Википедию, где говорится об отдыхе, и они считают, что все только на 1 уровне.Поэтому, может быть, они хотят, чтобы вы использовали PUT / POST, дали весь граф JSON и обновили все сразу?

Ответы [ 2 ]

13 голосов
/ 24 декабря 2010

Ваш пример - совершенно правильный подход.Однако во многих случаях User может существовать вне контекста просто entity.Я склонен идентифицировать ресурсы по отдельности, например:

/entity/1
/user/5

Чтобы увидеть пользователей, связанных с сущностью, я бы использовал:

/entity/1/users

Добавление пользователя может быть выполнено путем размещения пользователя,

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 голос
/ 23 декабря 2010

Я использую ваш метод для родительских / дочерних сущностей, но для многих ко многим я использую массив в своем объекте JSON, представляющий эту сущность.

Итак, используя ваш пример:

GET /entity/1

вернул бы объект сущности примерно так:

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

PUT передает этот же объект и обновляет как сущность, так и пользователей. Затем, чтобы получить конкретную информацию о пользователе:

GET /users/3

Использование PUT для пользователей / 3 обновит пользователя. PUT on / entity / 1 будет связывать пользователей с сущностями. К сожалению, не так много хорошей информации о том, как моделировать подобные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...