Gymterview
junior

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

PUT выполняет полную замену ресурса, а PATCH — частичное обновление. При PUT все не переданные поля будут сброшены, при PATCH — останутся без изменений.

Характеристика PUT PATCH
Тип обновления Полная замена ресурса Частичное обновление
Тело запроса Полное представление ресурса Только изменяемые поля
Идемпотентность Да Зависит от реализации
Поведение для отсутствующих полей Сбрасывает в значения по умолчанию / null Не затрагивает

Пример. Исходный ресурс:

Пример
{
  "id": 42,
  "name": "Иван",
  "email": "ivan@example.com",
  "age": 30
}

PUT — замена целиком. Если поле не указано, оно будет сброшено:

Пример
PUT /api/users/42
{"name": "Иван Петров", "email": "ivan@example.com", "age": 31}

Если отправить только {"name": "Иван Петров"}, поля email и age станут null.

PATCH — частичное обновление. Изменяются только переданные поля:

Пример
PATCH /api/users/42
{"age": 31}

Поля name и email останутся без изменений.

Пример реализации в Spring
// PUT — полная замена
@PutMapping("/users/{id}")
public ResponseEntity<User> replaceUser(@PathVariable Long id,
                                         @RequestBody User user) {
    user.setId(id);
    User saved = userService.save(user);
    return ResponseEntity.ok(saved);
}

// PATCH — частичное обновление
@PatchMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id,
                                        @RequestBody Map<String, Object> updates) {
    User updated = userService.partialUpdate(id, updates);
    return ResponseEntity.ok(updated);
}

На собеседовании: важно показать понимание через пример с отсутствующими полями. Частая ошибка — не упомянуть, что PATCH может быть как идемпотентным, так и нет, в зависимости от семантики (установка значения vs инкремент).