Можно ли использовать HTTP-метод POST для изменения (обновления) существующего ресурса?

«Можно ли использовать HTTP-метод POST для изменения (обновления) существующего ресурса?» — вопрос из категории API тестирование, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, технически можно, но это противоречит общепринятым RESTful-практикам и семантике HTTP. Согласно спецификации RFC 7231, POST — это метод запроса с широким назначением, и сервер может интерпретировать его как угодно, включая обновление.

С точки зрения тестирования API важно понимать разницу:

Метод Стандартная семантика (REST) Что проверять в тестах
POST Создание нового ресурса (идемпотентность не гарантируется). Код ответа 201 Created, заголовок Location, тело с новым ресурсом.
PUT Полная замена ресурса по известному URI (идемпотентен). Код 200 OK или 204 No Content, последующий GET возвращает обновленный ресурс.
PATCH Частичное обновление ресурса (идемпотентность зависит от реализации). Код 200 OK, проверка, что изменились только указанные поля.

Пример тест-кейса для нестандартного POST на обновление:

import requests
# Предположим, API использует POST для обновения (нестандартный подход)
update_payload = {"status": "inactive"}
response = requests.post("https://api.example.com/users/123/update", json=update_payload)

# Проверки:
assert response.status_code == 200
assert response.json()["status"] == "inactive"
# Важно: проверить, что другие поля пользователя не изменились случайно

Вывод для QA: При тестировании необходимо сверяться с документацией API. Если API использует POST для обновления, мы тестируем это поведение, но также отмечаем отклонение от лучших практик. Основная проверка — корректность изменения данных и возвращаемых кодов состояния.