Что произойдёт, если добавить тело (body) в GET-запрос?

«Что произойдёт, если добавить тело (body) в GET-запрос?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Что происходит:

  1. Сервер может проигнорировать тело: Многие веб-серверы (Apache, Nginx) и фреймворки по умолчанию не парсят тело GET-запроса. Данные просто не дойдут до вашего прикладного кода.
  2. Проблемы с кешированием: Прокси-серверы, кеширующие GET-запросы (например, CDN), обычно используют для ключа кеша только URL и заголовки. Тело запроса они игнорируют, что может привести к возврату некорректных закешированных данных.
  3. Ненадёжность клиентских библиотек: Не все HTTP-клиенты стабильно поддерживают отправку тела с GET.

Пример с cURL (где это возможно, но нежелательно):

curl -X GET http://api.example.com/search 
  -H "Content-Type: application/json" 
  -d '{"filters": {"active": true}}' # Тело будет отправлено, но сервер может его не принять

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

  • Для сложных условий поиска/фильтрации используйте POST к эндпоинту, семантика которого — создание результата запроса (например, POST /search).
  • Если нужно строго придерживаться GET, передавайте данные через query parameters в URL (с учётом ограничений на длину) или используйте специальные заголовки.

Вывод: Хотя отправить тело в GET можно, это антипаттерн, который ломает ожидания инфраструктуры и ведёт к нестабильности. Всегда используйте POST, PUT или PATCH для передачи данных в теле запроса.