Какие методы HTTP соответствуют каким методам CRUD?

213

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

Однако в чем разница между PUT / POST? Они соответствуют один к одному с созданием и обновлением?

Нарисовался
источник

Ответы:

298
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 карты для создания.

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

Пол Морган
источник
16
+1: важно различать PUT для создания ресурсов, имена которых (URI) назначаются клиентом, и POST для создания ресурсов, имена которых назначаются сервером. См. Ричардсон и Ruby's Restful Web Services (O'Reilly) для обсуждения этого вопроса.
Джим Ферранс
9
А поскольку PUT и DELETE еще не поддерживаются веб-браузерами, считается нормальным «перегрузить POST», добавив аргумент строки запроса, такой как method = PUT или method = DELETE, в URI, который был отправлен.
Джим Ферранс
2
Хороший анализ jcalcote.wordpress.com/2008/10/16/…
Борис Иванов
13
@JimFerrans PUT и DELETE поддерживаются веб-браузерами просто отлично, с XHR. Однако в контексте форм HTML спецификация HTML не поддерживает их, поэтому браузеры тоже не могут.
эйс
3
Несмотря на то, что каноническое сопоставление с буквой в CRUD отсутствует, во многих средах REST также используется GET / entity / для перечисления сущностей типа entity . GET / entity / id будет читать конкретную сущность, соответствующую идентификатору .
Тоддиус Жо
49

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

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

Donal Fellows
источник
1
Это различие между вариантами использования POSTи PUTявляется интересным и должно дать ответ на вопрос «Что такое« создавать », а что« обновлять »?» это намного понятнее. Кроме того, что касается реализации API, из этого следует, что повторение PUTдолжно равносильно неактивному бездействию, тогда как повторение POSTможет вызвать исключение, если предполагается, что некоторый аспект отправляемых данных остается уникальным в хранилище данных. это поддерживает приложение.
zerobandwidth
2
Этот ответ и следующий комментарий поднять важный момент, что осторожность следует проявлять в приравнивании CRUD тесно (1to1) с HTTP REST семантики. Это не каноническое отображение.
Мартин Спамер
35

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

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
ex0b1t
источник
10

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

Stormpath YouTube видео

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

pleshy
источник
10

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

обзор

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

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

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

d1jhoni1b
источник
1
Начиная с февраля 18 года, имейте в виду, что PATCH не полностью реализован в клиентских и серверных библиотеках.
Dizzley
о хорошо, спасибо, я вижу ... не могли бы вы опубликовать ссылку / ссылку, чтобы я мог посмотреть, пожалуйста?
d1jhoni1b
7

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

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

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

Т.е.

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

PUT: / блог / запись / 1

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

POST: / блог / запись

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

Общее понимание для систем CRUD: GET = запрос, POST = создание, Put = обновление, DELETE = удаление

Прикрепленный
источник
4

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

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

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

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

Метод PUT запрашивает, чтобы вложенный объект был сохранен под предоставленным Request-URI.

[...]

Принципиальное различие между запросами POST и PUT отражается в различном значении Request-URI. URI в запросе POST идентифицирует ресурс, который будет обрабатывать вложенный объект. Этот ресурс может быть процессом приема данных, шлюзом к другому протоколу или отдельным объектом, который принимает аннотации. Напротив, URI в запросе PUT идентифицирует объект, заключенный в запросе - пользовательский агент знает, для чего предназначен URI, и сервер НЕ ДОЛЖЕН пытаться применить запрос к какому-либо другому ресурсу. Если сервер желает, чтобы запрос был применен к другому URI,

Bruno
источник
3

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

  • HTTP GET - ВЫБРАТЬ / Запрос
  • HTTP PUT - ОБНОВЛЕНИЕ
  • HTTP POST - ВСТАВИТЬ / Создать
  • HTTP УДАЛИТЬ - УДАЛИТЬ
AJ.
источник
5
PUT и POST не совпадают точно с Update или Create; PUT «установлен» (т. Е. Когда вы заранее знаете имя ресурса и задаете значение для использования), а POST - это все остальное. Главное - подумать о том, что вы делаете, идемпотентно или нет.
Donal Fellows
1
+1 к комментарию. Предположение об абсолютном отображении между ними может вводить в заблуждение. Например, операция HTTP DELETE для некоторого URI может просто изменить (т. Е. ОБНОВИТЬ) запись на стороне сервера, чтобы операция HTTP GET больше не возвращала представление.
стоять
4
PUT и POST не совпадают точно с обновлением или созданием . Правда, но AJ описал, какой шаблон он использует.
Петр Доброгост
1

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

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

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

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

Мэтт Гибсон
источник