Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое HTTP PUT?
PUT — это один из методов HTTP, используемый для создания или полного обновления ресурса на указанном URI. Его ключевая особенность — идемпотентность. Идемпотентный метод означает, что многократное выполнение одного и того же запроса с одинаковыми данными приводит к одному и тому же состоянию системы, как и одно выполнение. Это делает PUT предпочтительным для операций обновления, где требуется гарантия конечного результата.
Основные характеристики и назначение PUT
- Создание или полное замещение: Если ресурс с указанным URI существует, PUT полностью заменяет его тело новыми данными из запроса. Если ресурс не существует, сервер может создать новый ресурс с этим URI (это зависит от реализации API).
- Идемпотентность: Как уже упомянуто, это главное отличие от, например, POST. Два одинаковых PUT запроса к одному URI дадут тот же результат, что и один. Это критично для надежности операций в распределенных системах.
- Требуется указание URI: Клиент должен точно знать полный URI ресурса, который он хочет создать или обновить. В отличие от POST, который часто отправляется на коллекцию (например,
/users), PUT отправляется на конкретный элемент (например,/users/123). - Ответ сервера: Успешный PUT запрос обычно возвращает код состояния 200 (OK) или 204 (No Content). Если PUT использовался для создания нового ресурса, может возвращаться 201 (Created).
Сравнение с другими методами: POST и PATCH
Для понимания PUT важно отличать его от POST и PATCH.
- POST: Используется для создания нового ресурса, часто без указания конкретного URI (сервер назначает ID). Он также может выполнять любые другие действия (например, запускать процесс). POST не является идемпотентным — два одинаковых POST запроса могут создать два одинаковых ресурса.
- PATCH: Используется для частичного обновления ресурса. Клиент отправляет только те поля, которые нужно изменить. PUT же требует отправки полного представления ресурса, даже если меняется только одно поле.
Пример PUT запроса в тестировании (REST API)
Рассмотрим пример теста для обновления данных пользователя через PUT.
import requests
import pytest
BASE_URL = "https://api.example.com"
def test_put_update_user():
# 1. Предполагаем, что пользователь с ID 101 уже существует
user_id = 101
url = f"{BASE_URL}/users/{user_id}"
# 2. Данные для полного обновления ресурса
updated_user_data = {
"name": "Иван Петров",
"email": "ivan.petrov@example.com",
"age": 30
}
# 3. Выполнение PUT запроса
response = requests.put(url, json=updated_user_data)
# 4. Проверка ответа
assert response.status_code == 200 # или 204
# 5. Проверка, что данные действительно обновились (GET запрос)
get_response = requests.get(url)
assert get_response.status_code == 200
actual_user = get_response.json()
assert actual_user["name"] == updated_user_data["name"]
assert actual_user["email"] == updated_user_data["email"]
assert actual_user["age"] == updated_user_data["age"]
# 6. Проверка идемпотентности (опционально, но важно для понимания)
response_repeat = requests.put(url, json=updated_user_data)
assert response_repeat.status_code == 200
get_response_after_repeat = requests.get(url)
user_after_repeat = get_response_after_repeat.json()
# Состояние ресурса должно быть идентичным после первого и второго PUT
assert user_after_repeat == actual_user
// Пример на JavaScript (Node.js с использованием axios)
const axios = require('axios');
async function testPutRequest() {
const userId = 101;
const url = `https://api.example.com/users/${userId}`;
const payload = {
name: "Иван Петров",
email: "ivan.petrov@example.com",
age: 30
};
try {
// Выполнение PUT запроса
const putResponse = await axios.put(url, payload);
console.log(`Status: ${putResponse.status}`); // 200 или 204
// Проверка через GET
const getResponse = await axios.get(url);
console.log('Updated user:', getResponse.data);
// Сравнение данных
const updatedUser = getResponse.data;
if (updatedUser.name === payload.name &&
updatedUser.email === payload.email &&
updatedUser.age === payload.age) {
console.log('PUT update verified successfully.');
}
} catch (error) {
console.error('Error during PUT test:', error.message);
}
}
Что проверяет QA Automation Engineer при работе с PUT?
- Корректность кода ответа: Запрос на существующий ресурс должен возвращать 200/204, на создание нового — возможно 201.
- Полное замещение данных: После PUT GET запрос должен возвращать ресурс, идентичный отправленному в теле PUT.
- Идемпотентность: Многократные идентичные PUT запросы не должны вызывать ошибок и должны приводить систему в одно и то же конечное состояние.
- Обработка ошибок: Проверка ответов на неверные данные (400), отсутствие ресурса (404), проблемы с авторизацией (401/403) и т.д.
- Валидация данных: Сервер должен правильно валидировать входящие данные (например, тип поля
age— число) и возвращать соответствующие ошибки. - Совместное использование с другими методами: Проверка, что после PUT можно успешно выполнить DELETE или PATCH на тот же ресурс.
Резюме
PUT — мощный идемпотентный метод HTTP для операций «полного обновления или создания». В контексте автоматизации тестирования REST API важно проверять не только его базовую функциональность, но и ключевое свойство — идемпотентность, которое обеспечивает надежность и предсказуемость взаимодействия клиента и сервера. Его следует выбирать над POST, когда клиент имеет полный контроль над URI и конечным состоянием ресурса, а также требуется гарантия отсутствия побочных эффектов от повторных запросов.