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

Какой тип запроса в REST использовать для изменения?

1.8 Middle🔥 121 комментариев
#Тестирование API

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

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

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

Выбор типа REST-запроса для изменения ресурса

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

PUT: Полная замена ресурса

Метод PUT предполагает, что клиент отправляет полное представление ресурса, заменяя существующее. Сервер обрабатывает запрос как замену всего ресурса по указанному URI.

Характеристики PUT:

  • Идемпотентность: Многократный вызов с одинаковыми данными даёт тот же результат.
  • Требует всех полей: Даже если изменяется одно поле, нужно отправить полный ресурс.
  • Использование: Подходит, когда клиент управляет всем состоянием ресурса.
// Пример PUT-запроса для обновления пользователя с ID=1
PUT /api/users/1
Content-Type: application/json

{
  "id": 1,
  "name": "Иван Петров",
  "email": "ivan@example.com",
  "age":   30
}

В этом примере все поля пользователя передаются заново. Если поле age опустить, оно может быть сброшено в null (зависит от реализации).

PATCH: Частичное обновление ресурса

Метод PATCH предназначен для частичных изменений. Клиент отправляет только те поля, которые нужно изменить.

Характеристики PATCH:

  • Не идемпотентен по умолчанию: Повторный вызов может дать разный результат (например, инкремент значения).
  • Экономия трафика: Передаются только изменяемые данные.
  • Гибкость: Поддерживает сложные операции (например, добавление в массив).
// Пример PATCH-Merge для обновления только имени и возраста
PATCH /api/users/1
Content-Type: application/json

{
  "name": "Иван Петров",
  "age":   30
}

Только поля name и age будут обновлены, остальные останутся без изменений.

Ключевые различия в таблице

КритерийPUTPATCH
НазначениеПолная замена ресурсаЧастичное обновление
ИдемпотентностьДаНет (обычно)
Передаваемые данныеВесь ресурсТолько изменяемые поля
Семантика"Вот новый ресурс""Вот изменения к ресурсу"
БезопасностьНе безопасенНе безопасен

Форматы PATCH-запросов

Стандарт PATCH допускает разные форматы описания изменений:

JSON Patch (RFC 6902)

Специфический формат для описания операций над JSON

PATCH /api/users/1
Content-Type: application/json-patch+json

[
  { "op": "replace", "path": "/name", "value": "Иван Петров" },
  { "op": "add", "path": "/phone", "value": "+79161234567" }
]

JSON Merge Patch (RFC 7386)

Более простой подход, похожий на обычный JSON

PATCH /api/users/1
Content-Type: application/merge-patch+json

{
  "name": "Иван Петров",
  "phone": "+79161234567"
}

Рекомендации по выбору

  1. Используйте PATCH, когда:

    • Нужно изменить только несколько полей большого ресурса
    • Хотите минимизировать трафик данных
    • Изменения сложные (добавление в массивы, инкременты)
  2. Используйте PUT, когда:

    • Клиент имеет полное представление ресурса
    • Требуется гарантированная идемпотентность
    • Ресурс относительно небольшой

Важные аспекты при тестировании

При тестировании API, обрабатывающего изменения, QA Engineer должен проверять:

  • Валидацию данных: Обработка некорректных или частичных данных в PUT
  • Идемпотентность: Повторные PUT-запросы не должны менять результат
  • Частичные обновления: PATCH должен корректно обновлять указанные поля
  • Ошибки: Ответы 400/422 при неверных данных, 404 при отсутствии ресурса
  • Конфликты: Обработка одновременных изменений (оптимистичная блокировка)
  • Безопасность: Проверка прав доступа (только авторизованные пользователи)

Заключение

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

Какой тип запроса в REST использовать для изменения? | PrepBro