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

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

Ответ

Технически — да, но на практике — нет.

Согласно спецификации HTTP (RFC 7231), тело у GET-запроса не запрещено, но семантически не определено. Серверы, прокси и библиотеки могут его игнорировать. GET предназначен для получения данных, а тело обычно используется в POST или PUT для передачи.

Пример GET с телом (антипаттерн):

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

{"key": "value"}

Рекомендуемые альтернативы:

  1. Параметры запроса (query string): /api/resource?key=value
  2. Заголовки (headers): Для передачи метаданных.
  3. POST: Если нужно отправить сложные или конфиденциальные данные.

Почему это плохая практика?

  • Нарушает ожидаемую семантику GET (идемпотентность и безопасность).
  • Не поддерживается многими инструментами и инфраструктурой (кэширование, прокси).