Включение идентификатора в URI для запросов PUT - PullRequest
36 голосов
/ 13 февраля 2012

Я читал некоторые документы о правильном использовании URI, использующих службы отдыха, и наткнулся на пример для базовых запросов GET .. DELETE.

Примеры URI:

Получить всех пользователей

GET http://mydomain.org/api/users

Получить конкретного пользователя

GET http://mydomain.org/api/users/1

Обновление пользователя

PUT http://mydomain.org/api/users/1

УДАЛИТЬ пользователя

DELETE http://mydomain.org/api/users/1

Пользовательским ресурсом может быть JSON или XML в виде:

{
    Id: 1,
    FirstName: 'John',
    LastName: 'Doe'
}

Мой вопрос такой. Чтобы поддерживать принципы REST, необходимо ли включать идентификатор ресурса в URI для запросов PUT?

Ответы [ 3 ]

42 голосов
/ 13 февраля 2012

Метод PUT запрашивает, чтобы состояние целевого ресурса было создано или заменено на состояние, определенное представлением, заключенным в полезную нагрузку сообщения запроса.

Вы хотите PUT ресурс с тем же URI, с которого вы намереваетесь GET его использовать.

RFC 72314.3.4 PUT

15 голосов
/ 29 июня 2012

Я собирался задать аналогичный вопрос, но я думаю, что нашел ответ. Я не уверен, что это по принципам REST, но вот почему было бы плохо не включать ID в URI. Скажем, ваш PUT похож на

PUT http://mydomain.org/api/users

А затем вы обновляете несколько пользователей с разными идентификаторами, но с одним и тем же URI, потому что в вашем URI нет идентификатора. Затем важно знать, что PUT является идемпотентным глаголом http. Это означает, что вызов его один раз должен иметь тот же эффект, что и вызов несколько раз. Поэтому некоторые промежуточные узлы в сети, просто следуя тому факту, что вы PUT несколько раз, могут игнорировать все ваши запросы, кроме одного, потому что они имеют одинаковый URI. Наконец, это определенно не то, что вы хотите, потому что целью было обновить несколько пользователей, а не только одного.

2 голосов
/ 26 ноября 2018

PUT http://example.com/api/users + body ведет себя как сложение карты с ключом http://example.com/api/users и значением тела. Новая запись создается, если ее не существует, иначе существующая перезаписывается.

Вопрос : какой ресурс стоит за http://example.com/api/users?

Ответ : аналогично предоставленному GET http://example.com/api/users, списком всех пользователей .

Итак, команда PUT http://example.com/api/users означает, что вы заменяете список всех пользователей предоставленным вами.

Для согласованности тело должно содержать массив пользователей:

[
  {
    Id: 1,
    FirstName: 'John',
    LastName: 'Doe'
  },
  {
    Id: 2,
    FirstName: 'Albert',
    LastName: 'Einstein'
  }
]
...