Ответ
PATCH — это HTTP-метод для частичного обновления существующего ресурса. В отличие от PUT, который заменяет ресурс целиком, PATCH применяет набор изменений ("патч") к ресурсу.
Основное назначение:
- Эффективное обновление только изменённых полей ресурса, уменьшая объём передаваемых данных.
- Реализация сложных операций обновления, которые не являются простой заменой.
Пример запроса PATCH:
PATCH /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json-patch+json
[
{ "op": "replace", "path": "/email", "value": "new.email@example.com" },
{ "op": "add", "path": "/tags", "value": ["premium"] }
]
Форматы патчей:
- JSON Patch (RFC 6902): Стандартный формат с операциями
add,remove,replace,move,copy,test. (Как в примере выше). - JSON Merge Patch (RFC 7396): Передаётся фрагмент JSON, который "вливается" в целевой ресурс. Для удаления поля используется значение
null.{ "email": "new.email@example.com", "age": null }
Пример на Spring Boot:
@PatchMapping(path = "/users/{id}", consumes = "application/json-patch+json")
public ResponseEntity<User> patchUser(@PathVariable Long id, @RequestBody JsonPatch patch) {
User user = userService.findById(id);
User patchedUser = applyPatch(patch, user); // Применение патча к entity
userService.save(patchedUser);
return ResponseEntity.ok(patchedUser);
}
| Ключевые отличия от PUT: | Метод | Идемпотентность | Семантика | Передаваемые данные |
|---|---|---|---|---|
| PUT | Да | Полная замена ресурса | Новое состояние ресурса целиком | |
| PATCH | Нет (в общем случае) | Частичное обновление | Инструкции по изменению (патч) |
Важно: Реализация PATCH на сервере должна корректно обрабатывать конфликты и гарантировать атомарность применения изменений.