Новый 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 % при большом объёме запросов.