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

187

Я использую PUTзапрос в моем приложении Rails. Теперь новый HTTP-глагол PATCHбыл реализован браузерами. Итак, я хочу знать , что основное различие между PATCHи PUTзапросы, и когда мы должны использовать один или другой.

user3276063
источник

Ответы:

139

HTTP-глаголы, вероятно, одна из самых загадочных вещей в протоколе HTTP. Они существуют, и их много, но почему они существуют?

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

Вот исчерпывающий список глаголов http: http://annevankesteren.nl/2007/10/http-methods

Там патч HTTP от официального RFC: https://datatracker.ietf.org/doc/rfc5789/?include_text=1

Метод PATCH запрашивает, чтобы набор изменений, описанный в объекте запроса, был применен к ресурсу, идентифицированному Request-URI. Набор изменений представлен в формате, называемом «документ исправления», идентифицируемый типом носителя. Если Request-URI не указывает на существующий ресурс, сервер МОЖЕТ создать новый ресурс, в зависимости от типа документа исправления (может ли он логически изменить нулевой ресурс), разрешений и т. Д.

Разница между запросами PUT и PATCH отражается в способе, которым сервер обрабатывает вложенный объект для изменения ресурса, идентифицируемого Request-URI. В запросе PUT вложенный объект считается модифицированной версией ресурса, хранящегося на исходном сервере, и клиент запрашивает замену сохраненной версии. Однако с помощью PATCH вложенный объект содержит набор инструкций, описывающих, как ресурс, находящийся в данный момент на исходном сервере, должен быть модифицирован для создания новой версии. Метод PATCH влияет на ресурс, указанный в Request-URI , и он также МОЖЕТиметь побочные эффекты на других ресурсах; то есть, новые ресурсы могут быть созданы, или существующие изменены, путем применения PATCH .

Насколько я знаю, глагол PATCH не используется так, как в приложениях rails ... Насколько я понимаю, глагол RFC patch должен использоваться для отправки инструкций патча, например, когда вы делаете diff между двумя файлами. Вместо повторной отправки всей сущности вы отправляете патч, который может быть намного меньше, чем повторная отправка всей сущности.

Представьте, что вы хотите отредактировать огромный файл. Вы редактируете 3 строки. Вместо того, чтобы отправлять файл обратно, вам просто нужно отправить diff. С другой стороны, отправка запроса на исправление может использоваться для асинхронного объединения файлов. Система контроля версий может потенциально использовать глагол PATCH для удаленного обновления кода.

Еще один возможный вариант использования связан с базами данных NoSQL, в нем можно хранить документы. Допустим, мы используем структуру JSON для отправки данных от сервера к клиенту. Если бы мы хотели удалить поле, мы могли бы использовать синтаксис, аналогичный синтаксису в mongodb, для $ unset . На самом деле, метод, используемый в mongodb для обновления документов, вероятно, может использоваться для обработки json-патчей.

Принимая этот пример:

db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)

Мы могли бы иметь что-то вроде этого:

PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }

И последнее, но не менее важное: люди могут говорить все, что хотят, о HTTP-глаголах. Есть только одна правда, и правда есть в RFC.

Лоик Фор-Лакруа
источник
1
Важно отметить, что RFC 5789 все еще находится на стадии предложения и не был официально принят и в настоящее время помечен как «irrata Существуют». Эта «лучшая практика» широко обсуждается, и технически PATCH еще не является частью стандарта HTTP. Единственная правда заключается в том, что, поскольку RFC неприемлем, вы не должны этого делать.
fishpen0
3
Даже если это все еще в предложении, это не означает, что это не должно использоваться. Если бы это было так, мы не смогли бы использовать веб-сокеты и многие другие rfcs, которые все еще находятся в предложении ... Реализация предложения в 100 раз лучше, чем реализация чего-то полностью настраиваемого, что никто другой не реализует.
Лоик Фор-Лакруа
BS. Он не «в предложении», а является частью стандарта HTTP (стандарт RFC 7231 делегирует в реестр IANA для методов, и там указан PATCH).
Джулиан Решке
@JulianReschke, если вы прочитаете вторую строку этого RFC, вы увидите, что он все еще помечен как ПРЕДЛАГАЕМЫЙ СТАНДАРТ . Так что нет, метод исправления все еще в предложении. RFC здесь, кстати. tools.ietf.org/html/rfc5789 и rfc7231 также ПРЕДЛАГАЕМЫЙ СТАНДАРТ . Если вы посмотрите на RFC821, например, он помечен как ИНТЕРНЕТ СТАНДАРТ
Loïc Faure-Lacroix
1
@JulianReschke en.wikipedia.org/wiki/Internet_Standard#Proposed_Standard ... Это не мое слово. Предлагаемый стандарт не означает, что вы не можете реализовать его нормально, как я объяснил выше. Это не значит, что он недостаточно стабилен для реализации ... но он все еще в предложении, если не помечен как Интернет-стандарт ... Я не уверен, как вы спорите по этому поводу. Он называется «предложенный стандарт» и не может означать ничего, кроме предложения. Если вы хотите утверждать, что предложенный стандарт может быть использован. Это именно то, что я написал.
Лоик Фор-Лакруа
104

Я провел пару часов с Google и нашел ответ здесь

PUT => Если пользователь может обновить всю или только часть записи , используйте PUT (пользователь контролирует, что обновляется)

PUT /users/123/email
new.email@example.org

PATCH => Если пользователь может обновить только частичную запись , скажем, просто адрес электронной почты (приложение контролирует, что можно обновить), используйте PATCH.

PATCH /users/123
[description of changes]

Зачем Patch

PUTметод требует большей пропускной способности или обрабатывает полные ресурсы вместо этого на частичной. Так PATCHбыло введено сокращение пропускной способности.

Объяснение о PATCH

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

PATCH это метод, в котором вложенная сущность содержит набор инструкций, описывающих, как ресурс, находящийся в данный момент на исходном сервере, должен быть модифицирован для создания новой версии.

PATCH /users/123
[
  { "op": "replace", "path": "/email", "value": "new.email@example.org" }
]

Здесь больше информации о путе и патче

Selvamani
источник
7
Почему этот патч небезопасен?
Бишишт Бхатта
1
PATCHсреди POST, и PUTт.д. не «безопасно», потому что он изменяет свои данные (имеет побочные эффекты). По сравнению с GETи OPTIONSт. Д. (Безопасные методы), где вы можете вызывать конечные точки несколько раз без каких-либо побочных эффектов.
emix
1
PATCH НЕ был введен для того, чтобы исключительно сохранить полосу пропускания. В RFC 5789 говорится:> «Необходим новый метод для улучшения взаимодействия и предотвращения ошибок». В многопараллельной среде, имеющей только PUT, которые включают остальную полезную нагрузку, увеличится риск изменения других атрибутов ресурса. PATCH решает такую ​​проблему.
Томаш Назар
43

ставить
, если я хочу изменить firstимя затем отправить путы запроса на обновление

{ "first": "Nazmul", "last": "hasan" } 

но здесь есть одна проблема, это putзапрос, что, когда я хочу отправить putзапрос, я должен отправить все два параметра, что firstиlast
поэтому обязательно отправить все значение снова

патч :
patchзапрос говорит. отправляйте только тот, dataкоторый вы хотите, updateи это не повлияет или не изменит другие данные.
поэтому нет необходимости отправлять все значения снова. просто я хочу обновить свое имя, поэтому мне нужно отправить только firstимя для обновления.

Назмул Хасан
источник
13

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

ПОЧТА

Метод HTTP.POST всегда создает новый ресурс на сервере. Это неидемпотентный запрос, т.е. если пользователь нажимает на одни и те же запросы 2 раза, он создает другой новый ресурс, если нет ограничений.

HTTP-метод post похож на INSERT-запрос в SQL, который всегда создает новую запись в базе данных.

Пример. Используйте метод POST для сохранения нового пользователя, порядка и т. Д., Когда сервер бэкэнда определяет идентификатор ресурса для нового ресурса.

СТАВИТЬ

В методе HTTP.PUT ресурс сначала идентифицируется по URL, а если он существует, то он обновляется, в противном случае создается новый ресурс. Когда целевой ресурс существует, он перезаписывает этот ресурс совершенно новым телом. То есть метод HTTP.PUT используется для СОЗДАНИЯ или ОБНОВЛЕНИЯ ресурса.

Метод http put похож на запрос MERGE в SQL, который вставляет или обновляет запись в зависимости от того, существует ли данная запись.

PUT-запрос является идемпотентным, т. Е. Двойное нажатие на одни и те же запросы приведет к обновлению существующей записи (новая запись не создана). В методе PUT идентификатор ресурса определяется клиентом и указывается в URL-адресе запроса.

Пример: используйте метод PUT для обновления существующего пользователя или заказа.

PATCH

Метод HTTP.PATCH используется для частичной модификации ресурса, то есть дельта-обновления.

Метод HTTP patch подобен запросу UPDATE в SQL, который устанавливает или обновляет только выбранные столбцы, а не всю строку.

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

PATCH / api / users / 40450236 / order / 10234557

Тело запроса: {status: 'Delivered'}

user8640104
источник
Это худшее объяснение, которое кто-либо может прочитать о пут и патче. И кроме того, после того, как так много хороших ответов уже опубликовано, что заставляет вас думать, что ваш ответ здесь другой?
CodeHunter
3

Есть ограничения в PUT over PATCH при создании обновлений. Использование PUT требует от нас указать все атрибуты, даже если мы хотим изменить только один атрибут. Но если мы используем метод PATCH, мы можем обновить только те поля, которые нам нужны, и нет необходимости упоминать все поля. PATCH не позволяет нам изменять значение в массиве или удалять атрибут или запись массива.

Ананд Мухале
источник
1

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

PUT - в PUT запросе вложенный объект будет рассматриваться как измененная версия ресурса, который находится на сервере, и он будет заменен этим измененным объектом.

PATCH - в запросе PATCH вложенный объект содержит набор инструкций о том, как объект, находящийся на сервере, будет изменен для создания более новой версии.

Нирадж Кумар
источник
1

Согласно условиям HTTP, PUTзапрос похож на оператор обновления базы данных. PUT- используется для модификации существующего ресурса (ранее размещен). С другой стороны, PATCHзапрос используется для обновления некоторой части существующего ресурса.

Например:

Данные клиента:

// This is just a example.

firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..

Когда мы хотим обновить всю запись? мы должны использовать Http PUT verbдля этого.

Такие как:

// Customer Details Updated.

firstName = "James++++";
lastName = "Anderson++++";
email = "email@Updated.com";
phoneNumber = "+92 0987654321";
//..

С другой стороны, если мы хотим обновить только часть записи, а не всю запись, тогда переходите к Http PATCH verb. Такие как:

   // Only Customer firstName and lastName is Updated.

    firstName = "Updated FirstName";
    lastName = "Updated LastName";
   //..

PUT VS POST:

При использовании PUTзапроса мы должны отправить все параметры, такие как firstName, lastName, email, phoneNumber Where as In В patchзапросе отправляются только те параметры, которые мы хотим обновить, и они не влияют или не изменяют другие данные.

Для получения более подробной информации, пожалуйста, посетите: https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/

Рехан Шах
источник
0

Put и Patch метод похожи. Но в рельсах у него другой метод. Если мы хотим обновить / заменить целую запись, мы должны использовать метод Put. Если мы хотим обновить конкретную запись, используйте метод Patch.

Шаэль Миттапелли
источник