Ответ
Для обновления ресурса в 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. А если перепутаешь — получишь или овердохуища лишних данных в запросе, или неожиданно затрёшь половину полей. Волнение ебать, терпения ноль ебать.