Ответ
Технически спецификация HTTP (RFC 7231) не запрещает наличие тела у GET-запроса, но и не определяет его семантику. На практике это приводит к проблемам.
Что происходит:
- Сервер может проигнорировать тело: Многие веб-серверы (Apache, Nginx) и фреймворки по умолчанию не парсят тело GET-запроса. Данные просто не дойдут до вашего прикладного кода.
- Проблемы с кешированием: Прокси-серверы, кеширующие GET-запросы (например, CDN), обычно используют для ключа кеша только URL и заголовки. Тело запроса они игнорируют, что может привести к возврату некорректных закешированных данных.
- Ненадёжность клиентских библиотек: Не все 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 для передачи данных в теле запроса.