Почему нужно использовать PATCH, а не POST для обновления ресурсов в REST API

«Почему нужно использовать PATCH, а не POST для обновления ресурсов в REST API» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование PATCH вместо POST для обновлений следует принципам семантики HTTP и идемпотентности REST API.

Ключевые различия:

Аспект POST PATCH
Семантика Создание или комплексное действие Частичное обновление ресурса
Идемпотентность Нет (повторный запрос создаст дубли) Да (повторный запрос даст тот же результат)
Передаваемые данные Обычно весь ресурс Только изменяемые поля

Практический пример из моего опыта с JSON API:

// POST — для создания (не для обновления!)
POST /api/users
{
  "name": "Alice",
  "email": "alice@example.com",
  "role": "user"
}
// → Создаёт нового пользователя, возвращает 201 Created

// PATCH — для частичного обновления
PATCH /api/users/123
{
  "email": "new.alice@example.com"
}
// → Обновляет только email, возвращает 200 OK

// PUT — для полной замены (редко используется)
PUT /api/users/123
{
  "name": "Alice",
  "email": "new.alice@example.com",
  "role": "user"
}
// → Заменяет ВСЕ поля, null для отсутствующих

Преимущества PATCH:

  1. Эффективность сети — передаются только изменяемые данные
  2. Безопасность — нельзя случайно затереть другие поля
  3. Поддержка конкурентности — можно использовать с ETag или If-Match
  4. Чёткая семантика — сразу понятно, что происходит частичное обновление

Реализация в Laravel:

// В контроллере
public function update(UserUpdateRequest $request, User $user)
{
    // PATCH-запрос автоматически обрабатывается
    $user->update($request->validated());
    return response()->json($user);
}

В микросервисной архитектуре мы строго соблюдали это различие, что упрощало интеграцию между сервисами.