Перейти к содержанию
Автор: LUMD

Новый HTTP‑метод QUERY: зачем он нужен и как использовать

RFC 10008 вводит метод QUERY, позволяющий отправлять тело запроса для сложных поисков, сохраняя безопасность и идемпотентность. Обзор преимуществ и ограничений.

Новый метод HTTP QUERY, описанный в RFC 10008, появился для передачи сложных поисковых параметров в теле запроса, оставаясь безопасным и идемпотентным. Это решает проблемы, связанные с длинными URL‑параметрами и ограничениями GET.

Почему GET уже не подходит для сложных запросов?

Традиционный GET использует параметры в строке URL. При глубокой вложенности, массивных фильтрах или специальных символах URL быстро растёт, достигает лимитов браузеров и серверов, а также усложняет кодирование. Кроме того, разные реализации по‑разному трактуют массивы и вложенные структуры, что приводит к неоднозначности.

Почему нельзя просто добавить тело к GET?

Теоретически GET может иметь тело, но ни один RFC явно не разрешает это. На практике клиенты, прокси и веб‑серверы обрабатывают такие запросы по‑разному: часть отвергает их, часть отбрасывает тело, а третья пытается интерпретировать. В результате запросы с телом GET часто блокируются корпоративными брандмауэрами.

Почему POST не подходит для чисто чтения?

POST допускает тело, но определён как неидемпотентный и предназначен для создания ресурсов. Это мешает автоматическому повтору запросов и кэшированию, поскольку промежуточные устройства считают POST «не безопасным» и не кешируют его. Для поисковых эндпоинтов это создаёт лишние сложности.

Что представляет собой метод QUERY?

QUERY – это «GET‑похожий» метод, но с обязательным телом запроса. Он сохраняет свойства GET: безопасен и идемпотентен, поэтому может кэшироваться. При кэшировании необходимо включать содержимое тела в ключ кеша, иначе разные запросы могут конфликтовать.

Какие подводные камни ждать?

Поддержка QUERY пока ограничена: большинство браузеров, прокси и серверов её не распознают. Например, клиент Kreya добавил нативную поддержку только в версии 1.20. Пока нет гарантии, что запросы QUERY будут работать везде, поэтому переход стоит делать постепенно. Если важна возможность делиться ссылкой или сохранять её в закладках, лучше оставить GET.

Что это значит для бизнеса?

Для сервисов с тяжёлыми фильтрами (например, поиск товаров по множеству атрибутов) переход на QUERY позволит сократить длину URL с нескольких килобайт до компактного JSON‑тела, ускорив обработку и снизив нагрузку на прокси. При этом кэшировать такие запросы придётся вручную, но экономия на сетевых ресурсах может достигать 30 % при большом объёме запросов.