В чем разница между PUT, POST и PATCH?

В чем разница между методами PUT, POST и PATCH в протоколе HTTP?


person selva kumar    schedule 27.06.2015    source источник
comment
stackoverflow.com/a/2590281/400277   -  person Nowhere man    schedule 27.06.2015
comment
возможный дубликат PUT vs POST в REST   -  person Nowhere man    schedule 27.06.2015
comment
Использование чего-либо, кроме GET / POST, в современных веб-API безумие. Слишком многие это делают. URI, определенные в большинстве современных приложений, НЕ ЯВЛЯЮТСЯ ресурсами, подлежащими замене, обновлению и т. Д. Это не документы. Вызываются ПРОЦЕДУРЫ. Сам URI редко идентифицирует реальный ресурс, кроме вызываемого метода. Поэтому используйте GET для запросов строки запроса и POST, когда вам нужно опубликовать данные или файлы JSON в теле запроса. ИМО, все остальное пытается втиснуть устаревшие концепции, связанные с URI и операциями со статическими HTML-документами, в новую архитектуру, которая не похожа на нее.   -  person Triynko    schedule 26.10.2017
comment
Все отличные ответы. Я просто хотел поделиться своим ответом о различиях и о том, когда следует использовать каждую из них.   -  person Train    schedule 12.11.2017
comment
@Triynko И процедуры, о которых вы говорите, включают создание, удаление и изменение ресурсов. Нет лучшего способа передать такие идеи, чем быть в состоянии RESTful. Почему нет?   -  person Константин Ван    schedule 17.01.2020
comment
@Triynko, почему-то вы застряли на уровне 0 модели зрелости Ричардсона, пора двигаться дальше: martinfowler.com /articles/richardsonMaturityModel.html   -  person Marcel Toth    schedule 06.02.2020


Ответы (9)


Разница между командами HTTP PUT, POST, GET, DELETE и PATCH IN:

Наиболее часто используемые HTTP-команды POST, GET, PUT, DELETE аналогичны операциям CRUD (создание, чтение, обновление и удаление) в базе данных. Мы указываем эти HTTP-глаголы в верхнем регистре. Итак, ниже приводится их сравнение.

  1. создать - POST
  2. читать - ПОЛУЧИТЬ
  3. обновление - PUT
  4. удалить - УДАЛИТЬ

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

Примечание.
Поскольку POST, PUT, DELETE изменяют содержимое, тесты с Fiddler для указанного ниже URL-адреса просто имитируют обновления. На самом деле он не удаляет и не изменяет. Мы можем просто видеть коды состояния, чтобы проверить, происходят ли вставки, обновления или удаления.

URL: http://jsonplaceholder.typicode.com/posts/

1) ПОЛУЧИТЬ:

GET - это простейший тип метода HTTP-запроса; тот, который браузеры используют каждый раз, когда вы нажимаете ссылку или вводите URL-адрес в адресную строку. Он указывает серверу передать клиенту данные, идентифицированные URL-адресом. Данные никогда не должны изменяться на стороне сервера в результате запроса GET. В этом смысле запрос GET доступен только для чтения.

Проверка с помощью Fiddler или PostMan. Мы можем использовать Fiddler для проверки ответа. Откройте Fiddler и выберите вкладку Compose. Укажите команду и URL-адрес, как показано ниже, и нажмите «Выполнить», чтобы проверить ответ.

Глагол: ПОЛУЧИТЬ

url: http://jsonplaceholder.typicode.com/posts/

Ответ: вы получите ответ в следующем виде:

«userId»: 1, «id»: 1, «title»: «sunt aut ...», «body»: «quia et suscipit ...»

В «счастливом» (или безошибочном) пути GET возвращает представление в XML или JSON и код ответа HTTP 200 (OK). В случае ошибки он чаще всего возвращает 404 (НЕ НАЙДЕН) или 400 (НЕПРАВИЛЬНЫЙ ЗАПРОС).

2) ОПУБЛИКОВАТЬ:

Глагол POST чаще всего используется для создания новых ресурсов. В частности, он используется для создания подчиненных ресурсов. То есть подчиняться какому-то другому (например, родительскому) ресурсу.

При успешном создании вернуть HTTP-статус 201, возвращая заголовок Location со ссылкой на вновь созданный ресурс с HTTP-статусом 201.

Проверка с помощью Fiddler или PostMan. Мы можем использовать Fiddler для проверки ответа. Откройте Fiddler и выберите вкладку Compose. Укажите команду и URL-адрес, как показано ниже, и нажмите «Выполнить», чтобы проверить ответ.

Глагол: POST

url: http://jsonplaceholder.typicode.com/posts/

Тело запроса:

data: {title: 'foo', body: 'bar', userId: 1000, Id: 1000}

Ответ: вы получите код ответа 201.

Если мы хотим проверить вставленную запись с Id = 1000, измените команду на Get, используйте тот же URL и нажмите Execute.

Как было сказано ранее, указанный выше URL-адрес разрешает только чтение (GET), мы не можем прочитать обновленные данные в реальном времени.

3) ПОСТАВИТЬ:

PUT чаще всего используется для возможности обновления, PUT-ing к известному URI ресурса с телом запроса, содержащим недавно обновленное представление исходного ресурса.

Проверка с помощью Fiddler или PostMan. Мы можем использовать Fiddler для проверки ответа. Откройте Fiddler и выберите вкладку Compose. Укажите команду и URL-адрес, как показано ниже, и нажмите «Выполнить», чтобы проверить ответ.

Глагол: PUT

url: http://jsonplaceholder.typicode.com/posts/1

Тело запроса:

data: {title: 'foo', body: 'bar', userId: 1, Id: 1}

Ответ: при успешном обновлении он возвращает 200 (или 204, если не возвращает никакого содержания в теле) из PUT.

4) УДАЛИТЬ:

DELETE довольно легко понять. Он используется для удаления ресурса, идентифицированного URI.

При успешном удалении верните HTTP-статус 200 (OK) вместе с телом ответа, возможно, представлением удаленного элемента (часто требует слишком большой пропускной способности) или завернутым ответом (см. Возвращаемые значения ниже). Либо это, либо возврат HTTP-статуса 204 (NO CONTENT) без тела ответа. Другими словами, рекомендуется использовать статус 204 без тела или ответ в стиле JSEND и статус HTTP 200.

Проверка с помощью Fiddler или PostMan. Мы можем использовать Fiddler для проверки ответа. Откройте Fiddler и выберите вкладку Compose. Укажите команду и URL-адрес, как показано ниже, и нажмите «Выполнить», чтобы проверить ответ.

Глагол: УДАЛИТЬ

url: http://jsonplaceholder.typicode.com/posts/1

Ответ: при успешном удалении он возвращает HTTP-статус 200 (ОК) вместе с телом ответа.

Пример между PUT и PATCH

PUT

Если бы мне пришлось изменить свое имя, отправьте запрос PUT для обновления:

{"first": "Nazmul", "last": "hasan"} Итак, здесь, чтобы обновить имя, нам нужно снова отправить все параметры данных.

ПАТЧ:

В запросе на исправление говорится, что мы будем отправлять только те данные, которые нам нужно изменить, не изменяя или не влияя на другие части данных. Пример: если нам нужно обновить только имя, мы передаем только имя.

Пожалуйста, перейдите по ссылкам ниже для получения дополнительной информации:

https://jsonplaceholder.typicode.com/

https://github.com/typicode/jsonplaceholder#how-to

В чем основное различие между запросом PATCH и PUT? < / а>

http://www.restapitutorial.com/lessons/httpmethods.html

person Krishna    schedule 21.11.2016
comment
PUT - это не обновление. PUT - это создание или замена объекта по заданному URI. Согласно спецификации HTTP, PUT идемпотентен. Да, его можно использовать для обновления, но думать только об обновлении неправильно. - person Maladon; 11.01.2017
comment
Я согласен, что PUT не обновляется, его можно сопоставить с помощью replace, потому что, когда вы отправляете PUT, он переопределяет существующий ресурс. Но если мы отправим PATCH, он заменит только указанные записи. - person Atul Chavan; 18.09.2017
comment
Поскольку PUT также можно использовать для создания, я не уверен, как ваш ответ указывает, что мне следует использовать? - person Rob P.; 23.09.2017
comment
Этот ответ намного лучше, но не сравнивается с PATCH: stackoverflow.com/a/630475/2391795 - person Vadorequest; 20.02.2018
comment
Это не то, как вы правильно отправляете POST, пожалуйста, проверьте: stackoverflow.com/questions/7075125/ - person Shayan; 30.09.2020
comment
Вы должны указать Content-Type в заголовках, а RequestBody будет выглядеть так: title=foo&body=bar&userid=1000&id=1000 - person Shayan; 30.09.2020
comment
вы сказали, сообщение должно возвращать 201 в качестве кода состояния, но я проверяю вашу ссылку для публикации, она возвращает 200 - person Sunil Garg; 05.11.2020
comment
@SunilGarg: может быть, вы не изменили http-глагол для публикации. 200 - для получения. - person Krishna; 10.11.2020
comment
@Krishna, я проверил в браузере, тип запроса - идентификатор сообщения, ответ имеет статус 200 - person Sunil Garg; 10.11.2020
comment
@SunilGarg: ну ладно, вот что я сделал ... Кстати, я пользуюсь почтальоном. В почтальоне перейдите в Файл - ›Новый. В раскрывающемся списке выберите http-команду в качестве публикации, URL-адрес запроса - jsonplaceholder.typicode.com/posts. "и в теле вставьте" данные: {title: 'foo', body: 'bar', userId: 1000, Id: 1000} 'и затем нажмите "Отправить". Я вижу тело как '{id: 101} и статус: 201Created .. Сообщите мне, если вы выполняете те же шаги. - person Krishna; 10.11.2020

PUT = заменить ВЕСЬ РЕСУРС новым предоставленным представлением

PATCH = заменить части исходного ресурса предоставленными значениями И | ИЛИ обновляются другие части ресурса, которые вы не предоставили (временные метки) И | ИЛИ обновление ресурса влияет на другие ресурсы (отношения)

https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-between-put-and-patch?page=1

person Ankit Rai    schedule 09.05.2018
comment
Похоже, что PUT означает обновление и перезапись. И похоже, что PATCH означает обновление и слияние. Я просто пытаюсь придумать последовательные и сжатые термины, чтобы описать то, что хорошо объясняет ваш ответ. - person MikeyE; 20.05.2021

вот простое описание всего:

  • POST всегда предназначен для создания ресурса (не имеет значения, был ли он продублирован)
  • PUT предназначен для проверки, существует ли ресурс, затем обновите, иначе создайте новый ресурс.
  • PATCH всегда для обновления ресурса
person a_m_dev    schedule 06.11.2019
comment
Это не совсем так. «Метод POST требует, чтобы целевой ресурс обработал представление, заключенное в запросе, в соответствии с собственной конкретной семантикой ресурса» - вот что заявляет RFC. «Добавление данных к существующему представлению ресурса» - один из примеров, предоставленных RFC. tools.ietf.org/html/rfc7231#section-4.3.3 - person Chomeh; 03.02.2021
comment
@Chomeh, на каком уровне определяется эта семантика / rfc? Это конфигурация фреймворка или языкового уровня, или что-то особенное для определенной части фреймворка? Например, будет ли POST / PUT / PATCH узла отличаться от ruby ​​on rails? - person stevec; 19.06.2021
comment
@stevec Приложение / API. Например, вы можете разработать API, который принимает POST для / delete, но не обязательно приводит к созданию нового ресурса (например, / deletions / {id}). - person Chomeh; 21.06.2021

Приведенное ниже определение взято из реального примера.

Обзор примера
Для всех данных клиента мы сохраняем идентификатор, чтобы найти эти данные клиента, и отправим этот идентификатор клиенту для справки.

  1. POST

    • If the client sends data without any identifier, then we will store the data and assign/generate a new identifier.
    • Если клиент снова отправит те же данные без какого-либо идентификатора, мы сохраним данные и назначим / сгенерируем новый идентификатор.
    • Примечание: здесь разрешено дублирование.
  2. PUT

    • If the client sends data with an identifier, then we will check whether that identifier exists. If the identifier exists, we will update the resource with the data, else we will create a resource with the data and assign/generate a new identifier.
  3. ПАТЧ

    • If the client sends data with an identifier, then we will check whether that identifier exists. If the identifier exists, we will update the resource with the data, else we will throw an exception.

Примечание. В методе PUT мы не генерируем исключение, если идентификатор не найден. Но в методе PATCH мы генерируем исключение, если идентификатор не найден.

Дайте мне знать, если у вас возникнут вопросы по вышеизложенному.

person Yokesh Waran    schedule 07.04.2019
comment
Простое и понятное объяснение! - person Jay Dadhania; 11.03.2021
comment
@Yokesh Waran Привет, я исправил твой ответ. Посмотри, в порядке ли они. - person akinuri; 02.05.2021

Самое простое объяснение:

POST - Создать НОВУЮ запись

PUT - если запись существует, обновить еще, создать новую запись

ПАТЧ - обновить

Читается

УДАЛИТЬ - удалить

person Sahibzada Abdul Hadi    schedule 24.01.2020
comment
Чем это существенно отличается от ответа Кваме, опубликованного примерно за две недели до вашего? - person ruffin; 05.03.2020

Типы запросов

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

GET / PUT - идемпотентный PATCH иногда может быть идемпотентным

Что такое идемпотент - это означает, что если мы запускаем запрос несколько раз, он не должен влиять на его результат (тот же результат; предположим, что корова беременна, и если мы снова ее разводим, то она не может беременеть несколько раз)

get :-

просто получить. Получите данные с сервера и покажите их пользователю

{
id:1
name:parth
email:[email protected]
}

post :-

создать новый ресурс в базе данных. Значит, добавляет новые данные. Это не идемпотентный.

put :-

Создать новый ресурс или добавить к существующему. Идемпотент, потому что он будет обновлять один и тот же ресурс каждый раз, и результат будет таким же. пример - исходные данные

{
id:1
name:parth
email:[email protected]
}
{
id:1
email:[email protected]
}

patch

Итак, теперь пришел запрос на исправление. PATCH иногда может быть идемпотентным

id:1
name:parth
email:[email protected]
}

имя патча: w

{
id:1
name:w
email:[email protected]
}
HTTP  Method
GET     yes
POST    no
PUT     yes
PATCH   no*
OPTIONS yes
HEAD    yes
DELETE  yes

Ресурсы: Идемпотентность - Что такое идемпотентность?

person Parth Patel    schedule 17.02.2019
comment
Что на самом деле означает иногда идемпотент? Что определяет идемпотентность? - person Polv; 11.03.2020
comment
Иногда идемпотент === Не идемпотент - он либо идемпотентный, либо не идемпотентный, промежуточного между ними нет. - person Jay Dadhania; 11.03.2021

Основное различие между запросами PUT и PATCH:

Предположим, у нас есть ресурс, содержащий имя и фамилию человека.

Если мы хотим изменить имя, мы отправляем запрос на обновление.

{ "first": "Michael", "last": "Angelo" }

Здесь, хотя мы меняем только имя, с запросом PUT мы должны отправлять оба параметра first и last.
Другими словами, необходимо снова отправить все значения, полную полезную нагрузку.

Однако, когда мы отправляем запрос PATCH, мы отправляем только те данные, которые хотим обновить. Другими словами, мы отправляем только имя для обновления, не нужно отправлять фамилию.

person beginners    schedule 20.08.2019

Подумайте об этом так ...

POST - создать

PUT - заменить

ПАТЧ - обновить

Читается

УДАЛИТЬ - удалить

person Kwame Opare Asiedu    schedule 11.01.2020
comment
Я бы, вероятно, добавил это различие: PUT, если клиент определяет адрес полученного ресурса, POST, если это делает сервер. - person ruffin; 05.03.2020

Вполне логичная разница между PUT и PATCH с отправкой полных и частичных данных для замены / обновления соответственно. Тем не менее, всего пара моментов, как показано ниже

  1. Иногда POST рассматривается как для обновлений, а PUT для создания
  2. Требует ли HTTP / проверяет отправку полных или частичных данных в PATCH? В противном случае PATCH может быть таким же, как обновление, как в PUT / POST.
person manish agrawal    schedule 28.12.2019