Глаголы HTTP, WebAPI

Я хотел бы знать сценарий использования POST против PUT в WebAPI. Я знаю основные понятия, что POST предназначен для создания ресурса, а PUT — для обновления ресурса, но не могу полностью понять, почему нам нужен PUT вместо POST.

У меня есть 2 метода WebAPI, которые создают/обновляют данные в моем хранилище SQL: 1. CreateUser(UserDto) 2. UpdateUser(UserDto)

UserDto содержит идентификатор пользователя, имя пользователя и адрес электронной почты.

Я могу использовать POST для методов CreateUser и UpdateUser, которые создают и обновляют пользователя в моем магазине.

Тогда в чем реальное преимущество использования POST для CreateUser и PUT для updateuser? Это просто стандарт/конвенция?

Спасибо


person Greg444    schedule 17.03.2017    source источник
comment
Разница в том, что PUT является идемпотентным по замыслу. Проверьте этот тег для получения дополнительной информации: stackoverflow.com/questions/tagged/idempotent+put   -  person Aurélien    schedule 17.03.2017
comment
И если PUT является идемпотентным по своей структуре, то это потому, что, согласно спецификациям HTTP, его URI является идентификатором объекта, который нужно создать или обновить (в отличие от POST).   -  person Aurélien    schedule 17.03.2017
comment
Возможный дубликат множества вопросов: stackoverflow.com/questions/tagged/post+put +отдых   -  person Aurélien    schedule 17.03.2017


Ответы (2)


POST всегда создает что-то новое. PUT обновляет существующую вещь. Это условность.

У вас должно быть:

POST /users : для создания нового пользователя. Полезная нагрузка не должна включать идентификатор

PUT /user/(id) : заменить пользовательский DTO данными в полезной нагрузке. Опять же, полезная нагрузка не должна содержать идентификатор пользователя.

PATCH /user/(id): для обновления определенных членов пользователя, но id.

Это соглашение о дизайне, как и шаблоны проектирования программного обеспечения, чтобы упростить общение и понимание для всех, кто должен использовать API.

person vtortola    schedule 17.03.2017
comment
POST всегда создает что-то новое: не обязательно (например, если полезная нагрузка содержит идентификатор). Это зависит от API (в отличие от PUT, который всегда является идемпотентным, поскольку идентификатором объекта является URI). - person Aurélien; 17.03.2017
comment
Разве это не должно вызывать HTTP 409? stackoverflow .com/questions/3825990/ - person vtortola; 17.03.2017
comment
Отправка кода 409 действительно может быть способом реализации идемпотентности. При этом побочные эффекты [в магазине] N › 0 одинаковых запросов будут такими же, как и для одного запроса. - person Aurélien; 20.03.2017

POST обычно используется для добавления нового ресурса в коллекцию ресурсов. Вот так: POST /users. Эта операция НЕ является идемпотентной и будет иметь побочный эффект при каждом вызове.

В то время как PUT обычно используется с семантикой замены, и вы точно знаете ресурс, который хотите заменить. Вот так: PUT /users/1. Эта операция является идемпотентной и не будет иметь побочных эффектов при последующих вызовах.

person Oleksandr Kobylianskyi    schedule 17.03.2017