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

Ответ

Основное различие между PUT и PATCH заключается в объёме изменений: PUT заменяет ресурс целиком, PATCH — обновляет его частично.

PUT (Полное обновление)

  • Семантика: "Замени ресурс по этому URI этими данными".
  • Требует передачи полного представления ресурса. Поля, не указанные в запросе, могут быть сброшены в значения по умолчанию или null.
  • Идемпотентный: Повторный вызов с теми же данными не меняет состояние системы.

Пример PUT (Spring Boot):

@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
    // user ДОЛЖЕН содержать все обязательные поля
    user.setId(id);
    User updatedUser = userRepository.save(user); // Полная замена
    return ResponseEntity.ok(updatedUser);
}

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

  • Семантика: "Примени эти изменения к ресурсу по этому URI".
  • Передаются только изменяемые поля. Остальные поля остаются нетронутыми.
  • Идемпотентность не гарантирована стандартом, но может быть достигнута при правильной реализации.

Пример PATCH (Spring Boot с Map):

@PatchMapping("/users/{id}")
public ResponseEntity<User> patchUser(@PathVariable Long id, @RequestBody Map<String, Object> updates) {
    User user = userRepository.findById(id).orElseThrow();
    // Обновляем только переданные поля
    if (updates.containsKey("email")) {
        user.setEmail((String) updates.get("email"));
    }
    // Поле 'name', если не передано, остаётся прежним
    User patchedUser = userRepository.save(user);
    return ResponseEntity.ok(patchedUser);
}

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

  • Используйте PUT, когда клиент может и должен отправлять полное представление ресурса (например, форма редактирования профиля).
  • Используйте PATCH, когда нужно обновить одно-два поля (например, смена статуса или email) для экономии трафика и избежания конфликтов.

Ответ 18+ 🔞

А, ну вот, опять эти ваши PUT и PATCH, блядь! Сидишь такой, думаешь — ну что за разница, один хрен обновляют данные, ёпта. Ан нет, разница-то, сука, овердохуищная, как между «заменить весь двигатель» и «подтянуть ремешок».

Смотри сюда, распиздяй. Основная засада в объёме изменений, блядь. PUT — это как прийти и сказать: «Нахуй всё старое, вот тебе новая штука целиком». А PATCH — это такой хитрожопый подход: «Слушай, братан, тут у тебя пуговица оторвалась, я только её и пришил, остальное не трогал».

PUT (Полная замена, ёб твою мать)

  • Что делает: «Замени, сука, всё что есть по этому адресу на то, что я тебе сейчас дам». Точка.
  • Требует: Тащить в запросе ВСЁ, блядь, все поля ресурса. Не принёс поле? Ну считай, что его теперь нет, сбросится в ноль или в дефолт. Писец твоим данным.
  • Идемпотентный: Это умное слово значит, что сколько раз ни долби этот запрос с одними данными — результат будет одинаковый. Как стучать головой в стену — хуже уже не станет, она и так разбита.

Вот тебе пример, как это на Spring Boot выглядит, не выёбывайся:

@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
    // Слышишь, user ДОЛЖЕН быть ПОЛНЫМ, все поля! Иначе пиздец.
    user.setId(id);
    User updatedUser = userRepository.save(user); // Просто хуяк — и старая запись похерена, вставлена новая.
    return ResponseEntity.ok(updatedUser);
}

PATCH (Хитрая жопа, частичное обновление)

  • Что делает: «Эй, примени вот этот маленький кусочек изменений к тому, что уже лежит». Не трогай лишнего, я сказал!
  • Требует: Только то, что хочешь поменять. Остальное остаётся как было, в целости и сохранности, блядь.
  • Идемпотентность: А вот тут, сука, не факт. По стандарту не гарантируется. Но если ты не кретин и реализовал логику нормально — то может быть идемпотентным. Сам виноват, если не сделал.

Смотри, как можно костылять на Spring Boot через Map:

@PatchMapping("/users/{id}")
public ResponseEntity<User> patchUser(@PathVariable Long id, @RequestBody Map<String, Object> updates) {
    User user = userRepository.findById(id).orElseThrow();
    // Лезем в мапу и тыкаем только то, что пришло
    if (updates.containsKey("email")) {
        user.setEmail((String) updates.get("email")); // Меняем только почту
    }
    // А поле 'name', например, если его в мапе нет — так и останется старым, его не тронули!
    User patchedUser = userRepository.save(user);
    return ResponseEntity.ok(patchedUser);
}

Итог, блядь, когда что юзать:

  • PUT — когда у клиента есть ВСЁ, полная картина. Например, он открыл форму редактирования профиля, там все поля подгрузились, и он их все и отправит. Полная замена, без вариантов.
  • PATCH — когда надо точечно чирикнуть. Смена статуса заказа, аватарки, почты. Чтобы не гонять по сети гигабайты лишних данных и случайно не перетереть то, что не нужно. Экономия, блядь, и от конфликтов спасение.

Всё, понял? Иди работай.