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 инкремент).