← Назад к вопросам

Что такое PATCH в REST?

1.3 Junior🔥 212 комментариев
#API и веб-протоколы

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Развернутое объяснение PATCH в контексте REST API

PATCH — это HTTP-метод, определенный в спецификации RFC 5789, предназначенный для частичного обновления ресурса в RESTful архитектуре. В отличие от PUT, который предполагает полную замену ресурса, PATCH позволяет передавать только те поля, которые необходимо изменить, что делает его более эффективным и безопасным для сценариев частичного редактирования.

Ключевые отличия PATCH от PUT и POST

МетодНазначениеИдемпотентностьТребуемые данные
PUTПолная замена ресурсаДаВсе поля ресурса
PATCHЧастичное обновлениеНет (обычно)Только изменяемые поля
POSTСоздание или нестандартные операцииНетЗависит от операции

Практическая реализация PATCH

Основная сложность PATCH заключается в формате описания изменений. Существует несколько распространенных подходов:

1. JSON Merge Patch (наиболее популярный)

Отправляется JSON-объект, где указаны только изменяемые поля. Для удаления полей используется значение null.

// PATCH /api/users/123
{
    "email": "new@example.com",
    "profile": {
        "city": "Москва"
    },
    "subscription": null
}

2. JSON Patch (RFC 6902)

Более формализованный стандарт с операциями типа "add", "remove", "replace".

// PATCH /api/users/123
[
    { "op": "replace", "path": "/email", "value": "new@example.com" },
    { "op": "add", "path": "/profile/city", "value": "Москва" },
    { "op": "remove", "path": "/subscription" }
]

3. Собственный формат частичного обновления

Многие API используют упрощенный подход с передачей измененных полей.

// Пример обработки PATCH в PHP
public function updateUser(Request $request, $id)
{
    $user = User::findOrFail($id);
    $validated = $request->validate([
        'email' => 'sometimes|email',
        'name' => 'sometimes|string|max:255'
    ]);
    
    // Обновляем только переданные поля
    $user->fill($validated);
    $user->save();
    
    return response()->json($user);
}

Преимущества использования PATCH

  • Эффективность передачи данных — уменьшение объема передаваемой информации
  • Конкурентная безопасность — меньшая вероятность конфликтов при параллельном редактировании
  • Гибкость клиентских реализаций — клиенты могут обновлять отдельные поля без знания полной структуры
  • Семантическая ясность — четкое разделение между "полной заменой" (PUT) и "частичным обновлением" (PATCH)

Недостатки и ограничения

  • Сложность валидации — необходимо обрабатывать "частичные" данные
  • Отсутствие идемпотентности по умолчанию — требуется дополнительная реализация
  • Неоднозначность форматов — разные API могут использовать разные подходы
  • Проблемы с кэшированием — сложнее чем с PUT

Лучшие практики реализации

  1. Четкая документация формата частичных обновлений
  2. Валидация частичных данных с учетом контекста
  3. Обработка вложенных объектов (поддержка nested updates)
  4. Оптимистичная блокировка для предотвращения конфликтов
  5. Единообразие формата во всем API

Пример реального сценария

// Бизнес-логика частичного обновления заказа
public function patchOrder(Request $request, $orderId)
{
    $order = Order::with('items')->findOrFail($orderId);
    
    // Разрешаем обновлять только определенные поля
    $allowedFields = ['status', 'delivery_address', 'notes'];
    $updates = array_intersect_key(
        $request->all(),
        array_flip($allowedFields)
    );
    
    // Применяем изменения с бизнес-логикой
    if (isset($updates['status'])) {
        $this->validateStatusTransition($order->status, $updates['status']);
    }
    
    $order->fill($updates);
    $order->save();
    
    // Логирование изменений
    ActivityLog::create([
        'changes' => $updates,
        'user_id' => auth()->id()
    ]);
    
    return new OrderResource($order);
}

PATCH является важным инструментом в RESTful архитектуре, который при правильной реализации значительно улучшает эффективность и удобство API для сценариев частичного редактирования. Ключевой аспект — выбор и последовательное использование подходящего формата описания изменений, понятного как серверной, так и клиентской сторонам.