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