Какие методы HTTP соответствуют каким методам CRUD? - PullRequest
199 голосов
/ 01 июня 2011

В программировании в стиле RESTful мы должны использовать методы HTTP в качестве наших строительных блоков. Я немного запутался, хотя какие методы соответствуют классическим методам CRUD. GET / Read и DELETE / Delete достаточно очевидны.

Однако, в чем разница между PUT / POST? Соответствуют ли они один к одному с помощью «Создать и обновить»?

Ответы [ 9 ]

283 голосов
/ 02 июня 2011
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT может отображаться как на Create, так и на Update в зависимости от существования URI, используемого с PUT.

POST сопоставляется с Create.

Исправление: POST также может отображаться наОбновление, хотя обычно оно используется для создания.POST также может быть частичным обновлением, поэтому нам не нужен предложенный метод PATCH.

47 голосов
/ 01 июня 2011

Весь ключ в том, делаете ли вы идемпотентное изменение или нет. То есть, если выполнение действия над сообщением дважды приведет к тому, что «будет» то же самое, как если бы оно было сделано только один раз, у вас есть идемпотентное изменение, и оно должно быть сопоставлено с PUT. Если нет, он отображается на POST. Если вы никогда не разрешаете клиенту синтезировать URL-адреса, PUT довольно близок к Update, и POST прекрасно справляется с Create, но это, безусловно, не единственный способ сделать это; если клиент знает, что он хочет создать /foo/abc, и знает, какой контент туда поместить, он просто отлично работает как PUT.

Каноническое описание POST - это когда вы совершаете покупку чего-либо: это действие, которое никто не хочет повторять, не зная об этом. В отличие от этого, предварительная установка адреса отправки заказа может быть выполнена с помощью PUT очень хорошо: не имеет значения, если вам посоветуют отправлять на 6 Anywhere Dr, Nowhereville один, два или сто раз: это все тот же адрес. Значит ли это, что это обновление? Может быть ... Все зависит от того, как вы хотите написать бэкэнд. (Обратите внимание, что результаты могут не совпадать: вы могли бы сообщить пользователю, когда они последний раз делали PUT, как часть представления ресурса, что гарантирует, что повторные PUT не вызовут идентичного результата, но результат все равно будет быть «одинаковым» в функциональном смысле.)

30 голосов
/ 01 ноября 2013

Я искал тот же ответ, вот что говорит IBM. IBM Link

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
9 голосов
/ 28 февраля 2013

Существует отличный видео-разговор на YouTube от Stormpath, который на самом деле объясняет это, URL должен перейти к правильной части видео:

Stormpath YouTube видео

ТакжеСтоит посмотреть, что это более часа разговоров, но очень интересно, если вы думаете об инвестировании времени в создание REST API.

8 голосов
/ 04 сентября 2016

Прямо сейчас (2016 г.) последние HTTP-глаголы - GET, POST, PATCH , PUT и DELETE

Обзор

  • HTTP GET - ВЫБРАТЬ / Запрос
  • HTTP PUT - ОБНОВЛЕНИЕ
  • HTTP POST - ВСТАВИТЬ / Создать
  • HTTP PATCH - Когда PUT представление полного представления ресурса громоздко и использует большую пропускную способность, например, когда вам необходимо частично обновить столбец
  • УДАЛЕНИЕ HTTP - УДАЛЕНИЕ

Надеюсь, это поможет!

Если вы заинтересованы в разработке REST API, это очень полезное чтение! веб-сайт веб-версии github хранилище

7 голосов
/ 01 июня 2011

Это зависит от конкретной ситуации .. но в целом:

PUT = обновить или изменить конкретный ресурс с конкретным URI ресурса.

POST = создать новый ресурс ниже источника данного URI.

Т.е.

Редактировать запись в блоге:

PUT: / blog / entry / 1

Создайте новый:

POST: / blog / entry

PUT может создать новый ресурс в некоторых случаях, когда URI нового ресурса очищается перед запросом.POST также может использоваться для реализации нескольких других вариантов использования, которые не охватываются другими (GET, PUT, DELETE, HEAD, OPTIONS)

Общее понимание для систем CRUD: GET = request, POST =создать, поставить = обновить, УДАЛИТЬ = удалить

4 голосов
/ 01 июня 2011

Стандартными блоками REST являются ресурсы (и URI) и гипермедиа. В этом контексте GET - это способ получить представление ресурса (который действительно может быть сопоставлен с SELECT в терминах CRUD).

Однако не обязательно ожидать однозначного отображения между операциями CRUD и глаголами HTTP. Основное различие между PUT и POST заключается в их идемпотентном свойстве. POST также чаще используется для частичных обновлений, поскольку PUT обычно подразумевает отправку полного нового представления ресурса.

Я бы предложил прочитать это:

HTTP-спецификация также является полезной ссылкой:

Метод PUT запрашивает, чтобы закрытая сущность должна храниться под предоставлен URI запроса.

[...]

Принципиальная разница между Запросы POST и PUT отражены в различное значение Request-URI. URI в запросе POST определяет ресурс, который будет обрабатывать вложенную сущность. Тот ресурс может быть принимающим данные процесс, ворота в какой-то другой протокол или отдельное лицо, которое принимает аннотации В отличие от URI в запросе PUT идентифицирует юридическое лицо, приложенное к запросу - пользовательский агент знает, что такое URI предназначен и сервер не должен попытаться применить запрос к некоторым другой ресурс. Если сервер желает что запрос будет применен к другой URI,

3 голосов
/ 01 июня 2011

Вообще говоря, это шаблон, который я использую:

  • HTTP GET - SELECT / Request
  • HTTP PUT - ОБНОВЛЕНИЕ
  • HTTP POST - INSERT / Create
  • УДАЛЕНИЕ HTTP - УДАЛЕНИЕ
1 голос
/ 01 июня 2011

Проект Symfony пытается объединить свои методы HTTP с методами CRUD, и их список связывает их следующим образом:

  • GET Получитьресурс с сервера
  • POST Создание ресурса на сервере
  • PUT Обновление ресурса на сервере
  • УДАЛЕНИЕ Удаление ресурса с сервера

Стоит отметить, что, как говорится на этой странице, «на самом деле многие современные браузеры не поддерживают методы PUT и DELETE».

Насколько я помню, Symfony «подделывает» PUT и DELETEдля тех браузеров, которые не поддерживают их при создании форм, чтобы попытаться максимально приблизиться к использованию теоретически правильного метода HTTP, даже если браузер его не поддерживает.

...