Ответ
Технически — да, но на практике — нет.
Согласно спецификации 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"}
Рекомендуемые альтернативы:
- Параметры запроса (query string):
/api/resource?key=value - Заголовки (headers): Для передачи метаданных.
- POST: Если нужно отправить сложные или конфиденциальные данные.
Почему это плохая практика?
- Нарушает ожидаемую семантику GET (идемпотентность и безопасность).
- Не поддерживается многими инструментами и инфраструктурой (кэширование, прокси).
Ответ 18+ 🔞
А, ну это классика, блядь! Технически-то можно, а на практике — нихуя нельзя, вот в чём парадокс, ёпта!
Смотри, по бумажкам, по этим вашим RFC, тело в GET-запросе — не запрещено. Ну типа, валидно, блядь. Но семантика-то у него — пиздец какая кривая! GET заточен под одно: прийти, забрать данные и сваливать. А тело — это уже как багаж, который ты везешь на получение. Это как прийти в библиотеку за книжкой, но при этом тащить с собой чемодан говна и пытаться его библиотекарю вручить. Он посмотрит на тебя как на еблана и спросит: «Ты куда это, сука, собрался?»
Вот, смотри, как выглядит этот высер:
GET /api/resource HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 15
{"key": "value"}
Видишь? Вроде бы всё по делу, но чувствуешь подвох? Чувствуешь, блядь? Подозрение ебать чувствую! Потому что весь интернет-трафик — это не только твой сервер, это куча промежуточного говна: прокси, кеши, балансировщики. И эта вся хуйня может посмотреть на метод GET, решить «а, это безопасный идемпотентный запрос, его можно закешировать» и проигнорировать тело нахуй! И твоё {"key": "value"} благополучно отправится в пизду, не долетев до адресата. И ты потом будешь сидеть и чесать репу: «А почему не работает, блядь? В постмане же летало!».
Поэтому все адекватные люди делают так:
- Параметры в строке запроса (query string). Старый добрый способ.
/api/resource?key=value&filter=awesome. Всё на виду, всё кешируется, все довольны. Для простых вещей — идеально. - Заголовки (headers). Нужно передать какую-нибудь служебную хрень вроде токена или метаданных? Вот их родной дом, блядь. Не лезь телом куда не просят.
- POST (или PUT). А если тебе реально нужно отправить в сервер целую простыню данных — конфиг, JSON, документ — то бери
POST. Он для этого и создан, ёпта! Это его семантика — «я принёс тебе посылку, обработай её».
Короче, суть в чём: использовать GET с телом — это как ебаться в сраку через джинсы. Технически возможно, но неудобно, противоестественно и все вокруг будут смотреть на тебя как на еблана. Не будь Герасимом, который пытается объяснить что-то сложное, мыча только «Му-му». Выбери правильный инструмент и живи спокойно, в рот меня чих-пых!