Может ли HTTP GET-запрос иметь тело (body)?

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

Ответ

Технически спецификация HTTP (RFC 7231) не запрещает наличие тела у GET-запроса, но это крайне не рекомендуется и считается антипаттерном.

Почему этого следует избегать:

  1. Неожиданное поведение: Многие инструменты (браузеры, серверы, библиотеки, прокси, кэши) могут игнорировать тело GET-запроса или неправильно его обрабатывать.
  2. Нарушение семантики: GET предназначен для получения ресурсов. Для операций, требующих передачи сложных данных, следует использовать POST, PUT или PATCH.
  3. Проблемы с инфраструктурой: Веб-фреймворки (Express, Django, Spring) и облачные сервисы (AWS API Gateway) могут не поддерживать или отбрасывать тело GET-запроса.

Пример нестандартного GET-запроса с телом (не делайте так):

GET /api/data HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 27

{"filter": {"active": true}}

Правильная альтернатива:

  • Используйте POST для действий, изменяющих состояние или требующих передачи сложных данных.
  • Передавайте простые параметры через строку запроса (URL).
  • Для сложных критериев поиска можно использовать POST на эндпоинт поиска (например, POST /api/search), что является общепринятой практикой (например, в Elasticsearch).