Можно ли отправлять POST-запрос с пустым телом и когда это нужно?

«Можно ли отправлять POST-запрос с пустым телом и когда это нужно?» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, POST-запрос с пустым телом (Content-Length: 0) допустим по спецификации HTTP. Его использование зависит от контракта конкретного API.

Типичные сценарии применения:

  1. Триггерное действие: Запрос служит сигналом, а все необходимые параметры передаются в URL (как путь или query-параметры).
    • POST /api/v1/tasks/42/run – запустить задачу с ID 42.
  2. Создание ресурса со значениями по умолчанию: Сервер создаёт сущность, инициализированную стандартными значениями.
    • POST /api/v1/notes – создать новую пустую заметку.
  3. Уведомление о событии (webhook): Внешний сервис может отправлять POST-запросы с пустым телом для простых пингов.

Пример отправки на Python (requests):

import requests

# Явно указать пустое тело
response = requests.post('https://api.example.com/trigger', data=None)
# Или просто не передавать параметр 'data'/'json'
response2 = requests.post('https://api.example.com/trigger')

print(f'Status: {response.status_code}')  # Может быть 200, 201, 204, 400, 422
print(f'Response: {response.text}')

Что важно проверить при тестировании такого API:

  • Ожидаемый статус-код: Успешный запрос может возвращать 200 OK, 201 Created или 204 No Content.
  • Обработка ошибок: Сервер должен корректно валидировать запрос и возвращать понятные ошибки (например, 400 Bad Request, если ожидалось тело, или 422 Unprocessable Entity).
  • Логика приложения: Не приводит ли такой запрос к созданию "битых" или неполных записей в БД.
  • Документация: Всегда сверяйтесь с документацией API. Если в спецификации (OpenAPI/Swagger) тело запроса отмечено как required, пустой запрос будет отклонён.