В чем разница между запросами PUT и PATCH?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между PUT и PATCH запросами
Концептуальная разница
PUT — это операция полной замены (full replacement). Вы отправляете полное представление ресурса, и сервер полностью заменяет существующий ресурс новыми данными. Любые поля, которые вы не отправили, могут быть установлены в null или удалены.
PATCH — это операция частичного обновления (partial update). Вы отправляете только те поля, которые нужно изменить, остальные остаются неизменными.
HTTP спецификация
PUT (RFC 7231)
- Idempotent операция (повторное выполнение дает тот же результат)
- Требует полное тело сущности
- Может создать новый ресурс если он не существует (в зависимости от реализации)
PATCH (RFC 5789)
- Может быть idempotent или non-idempotent (зависит от реализации)
- Может содержать только измененные поля
- Часто использует специальный формат (JSON Patch, JSON Merge Patch)
Практические примеры
PUT запрос:
PUT /api/v1/users/123
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"age": 30,
"role": "user"
}
Этот запрос полностью заменит пользователя. Если раньше были другие поля, они будут потеряны.
PATCH запрос:
PATCH /api/v1/users/123
Content-Type: application/json
{
"email": "newemail@example.com",
"age": 31
}
Этот запрос только обновит email и age, остальные поля останутся без изменений.
JSON Merge Patch (для PATCH)
PATCH /api/v1/users/123
Content-Type: application/merge-patch+json
{
"address": {
"city": "Moscow"
}
}
JSON Patch (более строгий формат)
PATCH /api/v1/users/123
Content-Type: application/json-patch+json
[
{ "op": "replace", "path": "/email", "value": "new@example.com" },
{ "op": "add", "path": "/phone", "value": "+79991234567" },
{ "op": "remove", "path": "/middleName" }
]
Когда использовать
PUT используйте для:
- Полного обновления сущности
- Когда клиент отправляет полный объект
- Когда нужна идемпотентность
PATCH используйте для:
- Частичного обновления
- Когда клиент отправляет только измененные поля
- Для экономии трафика (особенно важно в мобильных приложениях)
Тестирование в QA
При тестировании API убедитесь:
# Тест PUT
def test_put_replaces_full_resource():
response = requests.put(
"https://api.example.com/users/123",
json={"name": "Jane", "email": "jane@test.com"}
)
assert response.status_code == 200
data = response.json()
assert data["name"] == "Jane"
# Проверяем, что старые поля удалены или обнулены
# Тест PATCH
def test_patch_updates_partially():
response = requests.patch(
"https://api.example.com/users/123",
json={"email": "newemail@test.com"}
)
assert response.status_code == 200
data = response.json()
assert data["email"] == "newemail@test.com"
# Другие поля должны остаться прежними
Резюме
| Параметр | PUT | PATCH |
|---|---|---|
| Назначение | Полная замена | Частичное обновление |
| Idempotent | Да | Может варьироваться |
| Требуемые данные | Полный объект | Только изменения |
| Неотправленные поля | Могут быть удалены | Остаются без изменений |
| Использование | Переиспользование ресурса | Экономия трафика |
Выбирайте PUT когда уверены в полных данных, выбирайте PATCH для безопасного частичного обновления.