Какие HTTP-методы REST используются для обновления ресурса и в чем их различие?

Ответ

Для обновления ресурса в REST API используются методы PUT и PATCH.

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

  • Семантика: «Заменить ресурс целиком» данными из запроса.
  • Идемпотентность: Да. Многократный одинаковый PUT-запрос дает тот же результат.
  • Использование: Клиент должен отправить полное представление ресурса, даже для неизменяемых полей.

Пример PUT в Spring Boot:

@PutMapping("/books/{id}")
public ResponseEntity<Book> updateBook(
        @PathVariable Long id,
        @RequestBody Book updatedBook) {
    // Заменяем весь ресурс с указанным ID данными из updatedBook
    Book savedBook = bookService.saveOrUpdate(id, updatedBook);
    return ResponseEntity.ok(savedBook);
}

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

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

Пример PATCH (обновление одного поля) в Spring Boot:

@PatchMapping("/books/{id}/title")
public ResponseEntity<Void> updateBookTitle(
        @PathVariable Long id,
        @RequestParam String newTitle) {
    bookService.updateTitle(id, newTitle);
    return ResponseEntity.noContent().build();
}

Ключевое отличие: PUT обновляет ресурс полностью, PATCHчастично. Выбор зависит от требований API и желаемой семантики.

Ответ 18+ 🔞

Так, слушай, а вот это про PUT и PATCH — это вообще отдельная песня, блядь. Как будто два брата-близнеца, но один — мажорный идиот, который всё ломает, а второй — хитрая жопа, которая подкрадывается и меняет только то, что нужно.

Ну смотри, вот есть у тебя объект, книга там какая-нибудь. PUT — это такой тип, который приходит и говорит: «Всё, хуй с горы, старую книгу нахуй, вот тебе новая, целиком, от корки до корки». И не важно, что ты там в старой версии имя автора написал, а в новой забыл — он тупо заменит всё, что было, на то, что ты ему прислал. Идемпотентный, да, ёпта. Десять раз шлёшь одно и то же — десять раз получаешь один и тот же результат. Просто потому, что десять раз подряд всё нахуй стёр и заново написал.

А вот PATCH — это уже другое кино. Это как хирург с лазером, блядь. Не надо всю книгу переписывать. Хочешь только название поменять? Ну так и шли только название, ебать мои старые костыли! «Дай-ка я тут только цену подкручу» — и всё, остальное остаётся как было. Удобно? Удобно. Но с идемпотентностью тут уже цирк: если ты десять раз шлёшь команду «прибавить к цене 10», то каждый раз цена будет расти, понимаешь? Пиздец, а не идемпотентность. Хотя если шлёшь формат JSON Patch с чёткими операциями «заменить» — то тогда да, норм.

Вот смотри на код, тут всё видно. PUT-метод просто берёт и хуяк — заменяет всю сущность по айдишнику на ту, что прилетела в теле запроса. Без разговоров.

@PutMapping("/books/{id}")
public ResponseEntity<Book> updateBook(
        @PathVariable Long id,
        @RequestBody Book updatedBook) {
    // Заменяем весь ресурс с указанным ID данными из updatedBook
    Book savedBook = bookService.saveOrUpdate(id, updatedBook);
    return ResponseEntity.ok(savedBook);
}

А PATCH — он точечный, блядь. Вот пример: меняем только заголовок. Зачем тащить всю книгу, если нужно одно поле?

@PatchMapping("/books/{id}/title")
public ResponseEntity<Void> updateBookTitle(
        @PathVariable Long id,
        @RequestParam String newTitle) {
    bookService.updateTitle(id, newTitle);
    return ResponseEntity.noContent().build();
}

Короче, выбор простой, как палка: если нужно всё поменять — PUT. Если нужно кое-что подправить — PATCH. А если перепутаешь — получишь или овердохуища лишних данных в запросе, или неожиданно затрёшь половину полей. Волнение ебать, терпения ноль ебать.