HTTP QUERY: новый метод для сложных поисков в API

RFC 10008 определил новый HTTP-метод QUERY для выполнения сложных поисков в RESTful API. Проблема: GET с query-параметрами ломается на больших фильтрах (URL становится огромным, бывают проблемы с кодировкой и логированием), а GET с телом запроса не поддерживают многие клиенты и прокси. POST с телом работает, но он non-idempotent, что усложняет повторные попытки и кеширование.
QUERY работает как GET, но поддерживает тело запроса, остаётся безопасным и идемпотентным, кешируется (с учётом содержимого). Основной подвох: поддержка QUERY ещё очень новая и может занять годы. GET-параметры остаются нужны, особенно если пользователи должны делиться и сохранять ссылки.
Ключевые факты
- QUERY, безопасный идемпотентный метод с телом запроса, решает ограничения GET и POST для поисков
- Проблема старого подхода: GET с параметрами создаёт огромные URL, GET с телом не поддерживается, POST non-idempotent
- Поддержка QUERY сейчас минимальна, может быть нужны годы, не спешите мигрировать все поиски
- Кеширование QUERY сложнее, нужно учитывать тело запроса в ключе кеша
- Если пользователи делятся ссылками и бумаркят результаты, остаётся GET с параметрами
Ред. Десять лет черновиков IETF, чтобы официально разрешить то, что половина индустрии давно делала через POST и стыдливо называла «поиском». Глаголов в HTTP стало больше, проблем у прокси тоже.
Почему это важно
Разработчики API за десятилетия столкнулись с дилеммой: GET не позволяет отправлять тело запроса (хотя RFC не запрещает, но многие реализации его отвергают), а POST для чтения нарушает REST-семантику. QUERY закрывает зазор, явно определив, как правильно делать сложные запросы.
Ред. Дилемму решали ровно столько, сколько люди спорили, можно ли совать тело в GET. Спойлер: можно было всегда, просто реализации делали вид, что нет.
Кому это важно
Разработчикам серверов и клиентов REST API, авторам HTTP-клиентов (браузеры, инструменты, библиотеки), создателям прокси и middleware. Особенно для тех, кто строит поиск с вложенными фильтрами, логическими выражениями или передачей структурированных данных.
Ред. Авторам HTTP-клиентов и прокси, то есть тем, кто теперь обязан это поддержать, и тем, кто будет годами ждать, пока они это сделают.
Как это применить
Постепенно, с проверкой. Для новых поисков с усложнённой логикой вместо GET с огромным query-string используйте QUERY. Следите за поддержкой в инструментах (Postman, Kreya, curl добавляют поддержку). Но если пользователи должны копировать ссылки, оставляйте GET.
Ред. «Постепенно, с проверкой» это вежливый перевод фразы «в проде встретите ровно один сервер, который умеет QUERY, и это будет ваш собственный».
Можно ли доверять
RFC 10008, это официальный стандарт, обсуждавшийся годы. Семантика четкая: QUERY = GET с телом, safe и idempotent. Однако в боевой практике это очень новое, в дикой природе почти не встречается, поэтому подводные камни могут выявиться позже.
Ред. Стандарт официальный, обсуждался годами, семантика кристальная. В дикой природе метод не встречается почти нигде, так что доверять можно ровно настолько, насколько вы доверяете обновлению корпоративного файрвола.
Риски и подводные камни
Основной риск, тонкая поддержка. Старые прокси, корпоративные файрволы и браузеры могут отвергнуть QUERY. Кеширование требует особого внимания к телу запроса в ключе. Если забыть про кеш-key, получите коллизии. Ссылки, которыми пользователи делятся, QUERY не поддерживают, поэтому для публичных фильтров остаётся GET.
Ред. Старый прокси отвергнет QUERY молча, а кеш без учёта тела в ключе выдаст вам чужой результат с уверенным лицом. Классика: новый глагол, старые грабли.
«HTTP QUERY replaces POST for read-only requests»
— RFC 10008 / креya.app