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

Что такое метод HTTP-метод PATCH?

2.0 Middle🔥 162 комментариев
#Автоматизация тестирования#Инструменты тестирования#Тестирование API

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

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

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

HTTP-метод PATCH: концепция и практическое применение

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

Основные характеристики и отличие от PUT

  • PUT: требует отправки полного представления ресурса, даже если изменяется лишь одно поле. Сервер полностью заменяет существующий ресурс предоставленными данными.
  • PATCH: отправляет только набор изменений ("patch document"). Сервер применяет эти изменения к существующему ресурсу.

Пример различия на уровне запроса:

# PUT запрос для полного обновления пользователя (id=1)
PUT /users/1
Content-Type: application/json

{
    "id": 1,
    "name": "Иван Петров",  # Изменено
    "email": "ivan@example.com",
    "age": 30                # Новое поле
}
# PATCH запрос для частичного обновления того же пользователя
PATCH /users/1
Content-Type: application/json

{
    "name": "Иван Петров",  # Только изменённые данные
    "age": 30
}

Форматы "Patch Document" и спецификация RFC

Способ описания изменений в PATCH запросе не фиксирован одним стандартом. Клиент и сервер должны согласовать форматы. Наиболее распространённые:

  • JSON Patch (RFC 6902): стандартный формат для выражения операций над JSON-документом. Использует массив операций (add, remove, replace, move, copy, test).
[
    { "op": "replace", "path": "/name", "value": "Иван Петров" },
    { "op": "add", "path": "/age", "value": 30 }
]
  • JSON Merge Patch (RFC 7396): более простой подход, где тело запроса представляет собой JSON-фрагмент, который "сливается" с исходным ресурсом. Для удаления поля используется значение null.
{
    "name": "Иван Петров",
    "age": 30
}

Практическое использование в тестировании API

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

Ключевые аспекты для тестирования:

  • Валидация частичных данных: проверка, что сервер правильно обрабатывает запросы, где присутствуют только некоторые поля. Неполные или неверные данные для этих полей должны вызывать соответствующие ошибки (например, 400 Bad Request).
  • Идемпотентность: PATCH, в отличие от PUT, не является идемпотентным по умолчанию. Многократный отправка одного и того же PATCH запроса может приводить к разным результатам (например, если операция add выполняется несколько раз). Это важно учитывать при тестировании на устойчивость к повторным запросам.
  • Безопасность и контроль доступа: убедиться, что PATCH запросы к определённым ресурсам доступны только авторизованным пользователям с соответствующими правами.
  • Совместимость с форматами: проверить, что API корректно обрабатывает различные форматы патчей (JSON Patch, JSON Merge Patch), если они поддерживаются, и возвращает понятные ошибки при использовании неверного формата.
  • Проверка состояния после обновления: после отправки PATCH запроса необходимо убедиться, что:
    *   Только указанные поля ресурса были изменены.
    *   Другие поля остались неизменными.
    *   Возвращается корректный статус ответа (обычно `200 OK` или `204 No Content`).
    *   Ответ содержит актуальное представление ресурса или ссылку на него.

Пример теста на частичное обновление с проверкой:

import requests
import pytest

def test_partial_user_update():
    # Предполагаем, что пользователь уже существует
    user_id = 1
    original_user = requests.get(f"https://api.example.com/users/{user_id}").json()
    
    # Отправляем PATCH запрос для изменения только имени
    patch_data = {"name": "Новое Имя"}
    response = requests.patch(f"https://api.example.com/users/{user_id}", json=patch_data)
    
    # Проверяем статус ответа
    assert response.status_code == 200
    
    # Получаем обновлённого пользователя
    updated_user = requests.get(f"https://api.example.com/users/{user_id}").json()
    
    # Проверяем, что только имя изменилось
    assert updated_user["name"] == "Новое Имя"
    assert updated_user["email"] == original_user["email"]  # Поле email осталось прежним
    # ... проверка других полей

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