⁉️Тело в GET-запросе? ДА!
На каждом втором собесе по тестированию спрашивают: Можно ли отправить body в GET-запросе?
Правильный ответ: можно, но не стоит Реальный ответ: это никому не нужно Почти. Пристегнитесь. Я тут ТАКОЕ откопал...
Я наткнулся на документацию Elasticsearch — и офигел.
Вот пример оттуда: GET /my-index-000001/_search { "query": { "match": { "message": "this is a test" } } } Тело. В. GET. И это не случайность — Elastic ОФИЦИАЛЬНО рекомендует делать так. Почему? 🤔 Потому что Query DSL Формально — это язык основанный на JSON, специфичный для определённой доменной области, который в этом случае позволяет делать: 🔘сложные фильтры 🔘агрегации 🔘сортировки всё вместе в одном теле.
Если всё это пихать в URL — не влезет. Поэтому тело.(В ссылку может поместиться ограниченное количество символов и оно разнится в разных браузерах и условиях https://serpstat.com/blog/how-long-should-be-the-page-url-length-for-seo/#ip4x5j) Но HTTP против 🤬 По спецификации [RFC 7231, §4.3.1]](https://datatracker.ietf.org/doc/html/rfc7231) “A payload within a GET request message has no defined semantics.”
То есть тело можно отправить, но сервер не обязан его учитывать. Более того, в старом RFC 2616 прямо говорится: **“A message-body MUST NOT be included in a GET request.”
🧱 В ЧЁМ ПРОБЛЕМА И**спользовать Elasticsearch вы будете не в вакууме, а на основе своего стека.А фреймворки не в курсе, что можно отправить тело в GET
Express.jsИгнорирует. Тело не парсится.
Spring MVC@RequestBody не работает. Ошибка.
Django request.body пуст. Только GET-параметры.
Даже если тело ушло с клиента — оно не дойдёт до бизнес-логики.
🚧 КЕШ И ПРОКСИ Есть ещё одна ловушка — кеширование. GET-запросы кешируются по URL. Тело в кеш НЕ ВХОДИТ. Его игнорируют прокси и CDN. Результат? Запросы с разным телом, но одинаковым URL — будут считаться одинаковыми. Или наоборот — не кешироваться ВООБЩЕ. И вы получите нагрузку, задержки и баги.
🤦 ОТЛАДКА Проверить GET с телом — тот ещё квест.Postman отправит, но может не показать в логах. curl потребует странного синтаксиса. Swagger/OpenAPI — вообще не позволяет описать такой запрос. В OpenAPI 3.0 это считается **ОШИБКОЙ.
🧩 А ELASTIC ЭТО ЗАЧЕМ?** Elastic поступает логично: они хотят, чтобы поисковые запросы выглядели как GET, потому что это всё-таки получение данных.И я тут даже задумался, все же логично🌝 Идемпотентность сохраняется, метод безопасен, SAFE
Но даже они признают, что это ненадёжно. Лучше используйте POST, если в запросе есть тело. 📌 ИТОГ 🔘Если ты тестировщик и на проекте вдруг есть GET с телом — проверяй ВСЕ:проксирование, логи, интеграции А еще лучше спорь с командой до последнего, чтобы одумалисьИ держи в уме этот факт чтобы блеснуть на собесах 😉 🔘Если ты разработчик и используешь elastic на проекте — держи в голове такие кейсы 🔘Если ты архитектор — не делай так 🙏🥺Все источники оставил в чате Отбивай все реакции, шли пост другу и коллеге, чтобы тоже знали.
В этом посте были ссылки, но мы их удалили по правилам Сетки