Можно ли отправить тело в GET-запросе?

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

Ответ

Технически — да, но это противоречит семантике HTTP и не рекомендуется.

  • Спецификация RFC 7231 явно не запрещает тело в GET, но указывает, что серверы могут его игнорировать. Многие прокси, балансировщики нагрузки и библиотеки (например, некоторые версии curl, requests в Python) могут обрезать или некорректно обрабатывать такое тело.
  • GET предназначен для получения (запроса) данных, а не для их отправки. Для отправки данных используются методы POST, PUT или PATCH.
  • Проблемы при тестировании:
    • Непредсказуемое поведение на разных серверах и инфраструктуре.
    • Сложность отладки и анализа трафика через стандартные прокси (Charles, Fiddler), которые могут не отображать тело GET.
    • Нарушение контракта API, что усложняет автоматизацию.

Правильная практика для GET: передавать параметры через query-строку в URL.

GET /api/users?active=true&role=admin HTTP/1.1
Host: example.com

Если нужно отправить сложные данные (например, фильтр), используйте POST даже для операций, не создающих ресурс, либо кодируйте данные в query-параметрах (с учетом ограничения длины URL).