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

Ответ

Технически спецификация 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 для передачи данных в теле запроса.

Ответ 18+ 🔞

А, слушай, вот это история про GET-запросы с телом — просто ёперный театр, ей-богу. Смотри, по бумажкам-то, по этой вашей RFC, вроде как и не запрещено запихнуть тело в GET. Ну типа, технически дырка есть. Но семантику-то для этого тела нихуя не определили! Вот и начинается пиздец.

Что на практике выходит:

  1. Сервер может на это тело просто забить. Представляешь? Ты там накодил на клиенте целый роман в JSON, отправил, а сервер, типа Apache или Nginx, его даже читать не станет. Твои данные просто в никуда сольются, как будто их и не было. Доверия к такому подходу — ебать ноль.
  2. Кеширование ебётся полностью. Прокси и CDN, которые кешируют GET-запросы, они же ключ формируют из URL и заголовков. А на твоё хитрое тело им похуй! И получится, что запросы с разными телами, но одним URL, вернут одну и ту же закешированную хуйню. Вот это поворот, да? Удивление — пиздец.
  3. Клиенты тоже глючные. Не каждая библиотека нормально отправит тело с GET, могут быть сюрпризы.

Вот, смотри, как можно наколдовать через cURL, но это путь в никуда:

curl -X GET http://api.example.com/search 
  -H "Content-Type: application/json" 
  -d '{"filters": {"active": true}}' # Тело улетит, но куда оно денется — хуй знает

А как делать правильно, чтобы не было мучительно больно?

  • Для сложной фильтрации, где параметров овердохуища, просто юзай POST на какой-нибудь /search. Семантика подходит — ты же «создаёшь» запрос на поиск. Все довольны, всё предсказуемо.
  • Уж если прям приперло и хочется именно GET, тогда пихай всё в query-параметры в URL (только помни, что длина не безгранична) или в специальные заголовки. Но это уже такая хитрая жопа, лучше не надо.

Короче, вывод простой: Да, отправить тело в GET — технически можно, как воткнуть вилку в розетку мокрыми руками. Но это пиздопроебибнный антипаттерн, который ломает всю инфраструктуру. Не выёбывайся, используй для передачи данных в теле нормальные методы: POST, PUT или PATCH. И будет всем счастье, а не хиросима.