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

Можно ли создать объект через PUT?

1.7 Middle🔥 111 комментариев
#Другое

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

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

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

Можно ли создать объект через HTTP метод PUT?

Да, согласно спецификации HTTP/1.1 (RFC 7231), метод PUT может использоваться для создания нового ресурса. Это является одной из его основных и допустимых семантик. Однако возможность создания через PUT зависит от реализации конкретного API и его архитектурных принципов (RESTful или иных). Давайте разберем это подробнее.

Семантика метода PUT согласно RFC 7231

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

  • Идемпотентность: PUT является идемпотентным методом. Это означает, что несколько идентичных запросов PUT должны оказывать тот же эффект, что и один запрос. Это отличает его от POST, который не является идемпотентным.
  • Операция "Create or Update": Клиент указывает целевой URI. Если ресурс по этому URI существует, сервер должен полностью заменить его содержимое данными из запроса. Если ресурс не существует, и клиент имеет право его создать, сервер может создать новый ресурс по указанному URI.

Пример кода создания объекта через PUT (клиентская сторона):

PUT /api/users/alice HTTP/1.1
Host: example.com
Content-Type: application/json

{
    "name": "Alice",
    "email": "alice@example.com"
}

Ответ сервера при успешном создании:

HTTP/1.1 201 Created
Location: /api/users/alice
Content-Type: application/json

{
    "id": "alice",
    "name": "Alice",
    "email": "alice@example.com"
}

Сравнение PUT с POST для создания ресурса

На практике выбор между PUT и POST для создания часто определяется тем, кто определяет идентификатор (URI) ресурса.

АспектPUTPOST
Идентификатор (URI)Определяется клиентом. Клиент знает полный URI создаваемого ресурса (например, /api/users/{username}).Определяется сервером. Клиент отправляет данные на коллекцию (например, /api/users), а сервер в ответе возвращает URI созданного ресурса (часто в заголовке Location).
ИдемпотентностьДа. Повторный запрос с теми же данными не изменит состояние системы.Нет. Повторный запрос может привести к созданию дубликатов.
Типичный HTTP-код ответаПри создании: 201 Created. При обновлении: 200 OK или 204 No Content.При создании: 201 Created.
ИспользованиеСоздание, когда ID известен клиенту (логин, уникальный код). Полное обновление существующего ресурса.Создание, когда ID генерируется сервером (автоинкремент, UUID). Отправка данных для обработки (не обязательно создание ресурса).

Практические соображения для QA Automation Engineer

  1. Тестирование сценариев PUT:
    *   **Создание нового ресурса (ожидаемый код `201 Created`)**.
    *   **Полное обновление существующего ресурса (ожидаемый код `200 OK` или `204 No Content`)**.
    *   Проверка **идемпотентности**: отправка двух идентичных PUT-запросов подряд и проверка, что результат (и код ответа) после второго запроса соответствует обновлению, а не ошибке.
    *   **Обработка ошибок**: Проверка ответов `404 Not Found` (если создание запрещено и ресурс не найден), `409 Conflict` (при несоответствии состояния), `403 Forbidden` / `401 Unauthorized` (права доступа).

  1. Вариации в реализации API:
    *   Некоторые API строго следуют REST и разрешают создание через PUT.
    *   Другие API (особенно гибридные или RPC-ориентированные) могут использовать PUT **только для обновлений**, а для создания — исключительно POST. **Всегда нужно сверяться с документацией тестируемого API.**

  1. Автоматизация проверок:
    import pytest
    import requests
    
    BASE_URL = "https://api.example.com"
    USER_URI = f"{BASE_URL}/users/testuser"
    
    def test_put_create_user():
        """Тест создания пользователя через PUT."""
        user_data = {"name": "Test User", "email": "test@example.com"}
        response = requests.put(USER_URI, json=user_data)
    
        # Проверяем успешное создание
        assert response.status_code == 201
        assert response.headers.get("Location") == USER_URI
    
        # Проверяем, что данные сохранились
        get_response = requests.get(USER_URI)
        assert get_response.status_code == 200
        assert get_response.json()["email"] == user_data["email"]
    
    def test_put_update_user():
        """Тест обновления пользователя через PUT (идемпотентность)."""
        updated_data = {"name": "Updated Name", "email": "updated@example.com"}
    
        # Первый запрос - создание/обновление
        resp1 = requests.put(USER_URI, json=updated_data)
        # Второй идемпотентный запрос
        resp2 = requests.put(USER_URI, json=updated_data)
    
        # Оба запроса должны завершиться успешно (обновлением)
        assert resp1.status_code in (200, 204)
        assert resp2.status_code in (200, 204)
    
        # Проверяем, что состояние после двух запросов корректно
        final_data = requests.get(USER_URI).json()
        assert final_data["name"] == updated_data["name"]
    

Итог: Создание объекта через PUT разрешено стандартом HTTP и возможно. Как QA Automation Engineer, вы должны понимать эту семантику, но ключевым источником истины является документация тестируемого API. Ваша задача — разрабатывать автотесты, которые проверяют как стандартное поведение, так и специфичные для реализации сценарии, включая создание, обновление, идемпотентность и обработку ошибок метода PUT.