В чем разница между HTTP-методами PUT и PATCH?

«В чем разница между HTTP-методами PUT и PATCH?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оба метода используются для обновления ресурсов, но с разной семантикой.

PUT — Полная замена

  • Семантика: "Поместить ресурс по данному URL". Клиент отправляет полное представление ресурса.
  • Идемпотентность: Да. Многократный вызов с одними данными дает тот же результат.
  • Побочный эффект: Если в запросе отсутствуют поля, существующие на сервере, они будут удалены (установлены в null или значение по умолчанию).

PATCH — Частичное обновление

  • Семантика: "Применить частичные модификации к ресурсу". Клиент отправляет только изменяемые поля.
  • Идемпотентность: Не гарантирована (зависит от реализации сервера).
  • Побочный эффект: Не указанные поля остаются без изменений.

Пример (Обновление пользователя с id=1):

// Исходный ресурс на сервере
{
  "id": 1,
  "name": "Alice",
  "email": "alice@example.com",
  "age": 30
}

// PUT-запрос (отправляем полный объект)
PUT /users/1
{
  "name": "Alice Smith",
  "email": "alice.smith@example.com"
}
// Результат: Поле `age` будет УДАЛЕНО.
// {"id":1, "name":"Alice Smith", "email":"alice.smith@example.com"}

// PATCH-запрос (отправляем только изменения)
PATCH /users/1
{
  "name": "Alice Smith"
}
// Результат: Поле `age` и `email` СОХРАНЯЮТСЯ.
// {"id":1, "name":"Alice Smith", "email":"alice@example.com", "age":30}

Когда использовать:

  • PUT: Когда клиент управляет всем ресурсом (например, сохранение черновика, замена конфигурации).
  • PATCH: Для оптимизации трафика и атомарного обновления отдельных полей (например, смена аватара, обновление статуса).