Можно ли передавать параметры в теле HTTP GET запроса
Что проверяют
Различаете ли вы «стандарт разрешает» и «инфраструктура пропустит». Вопрос выглядит как проверка буквы спецификации, но проверяют инженерную осторожность: поведение промежуточных узлов тут важнее формальной возможности.
Как отвечать
Спецификация HTTP не запрещает тело у GET, но и не определяет для него смысла: сервер вправе его проигнорировать или ответить ошибкой. На практике это значит, что запрос работает локально и разваливается за балансировщиком или кэширующим прокси, причём молча, отдавая выборку без фильтра вместо ошибки.
В Java разница видна по клиентам. Старый HttpURLConnection тело к GET приделать не даст, OkHttp отвергает такой запрос исключением ещё на сборке, а java.net.http.HttpClient через method("GET", BodyPublishers.ofString(json)) отправит что угодно. То есть возможность зависит от библиотеки, а не от вашего желания.
По существу отвечайте так: параметры чтения идут в строку запроса, а если их перестало хватать, это сигнал сменить метод. Сложный поисковый фильтр оформляется как POST /search, заодно исчезает проблема длины, ведь строка запроса ограничена не спецификацией, а настройками сервера, у распространённых контейнеров буфер заголовков около восьми килобайт. Плата за POST это потеря кэширования и идемпотентности по умолчанию, и об этом лучше сказать самому.
Где спотыкаются
Утверждают, что стандарт запрещает. Запрета нет, есть отсутствие определённого поведения, и точная формулировка звучит как «работает не везде и полагаться нельзя».
Проверяют идею одним инструментом. Консольный клиент отправляет тело послушно, поэтому вывод «у меня работает» ничего не говорит про боевой контур с прокси и кэшем.
Меняют метод и забывают про последствия. После перехода на POST ответ перестаёт кэшироваться, повтор запроса больше не считается безопасным, а мониторинг, разбиравший параметры из URL, слепнет.