Post #478
497

🔎 У HTTP появился новый метод QUERY
Двадцать лет индустрия пытается ответить на главный вопрос жизни, вселенной и всего такого. А именно: как посылать сложные запросы?
Потому что если посылать GET, то у него есть ограничения по длине. К примеру Nginx по умолчанию рубит строку запроса на 8 КБ. Плюс тело у GET семантически не определено: ты можешь его положить, но его по дороге могут не передать.
Двадцать лет индустрия отвечала на этот вопрос: 4️⃣ 2️⃣
И вот наконец в этом году стала отвечать 6️⃣7️⃣
Ладно, это все шутки. На самом деле предлагалось взять метод POST, который создан совсем для другого, и заворачивать все в него, и в общем это так и работает.
Минусы у этого подхода вот такие. POST по своей сути не идемпотентный. Словил таймаут, повторить не можешь (ну если следовать правилам): вдруг оно там уже что-то создало. Закэшировать тоже нельзя. На редиректе метод может схлопнуться в GET вместе с телом. Ну и в логах с трейсами твой поиск по каталогу выглядит как запись в БД.
📬 Но! НО! буквально на днях мы дожили. В июне 2026 приняли RFC 10008, и стал доступен новый метод: QUERY. Тело как у POST, семантика как у GET. Идемпотентный и кэшируемый.
Вообще, для меня это шок. Я вообще такого, мне кажется, никогда не видел. Может, я просто не следил и новые методы появляются постоянно? Не знаю, но я вижу это в первый раз. И это прикольно.
Теперь про дотнет. Десятка метод уже поддерживает: HttpMethod.Query на клиенте, HttpMethods.Query и IsQuery() на сервере, Kestrel умеет его парсить.
На пояснительно дикпике можно ознакомиться с тем, как выглядит все это на посылку и на прием 🍆
Пока что MapQuery() для minimal API и [HttpQuery] для контроллеров недоступны, обещают вернуться в .NET 11-й. Но мне кажется что не проблема написать свой экстеншен метод, если будет нужно.
Это все круто, но как вы понимаете в этой бочке дёгтя все вышеперечисленной было лишь чайной ложечкой мёда.
🔞 Использовать не получится еще лет 20: не все маршрутизаторы, устройства, вафы и прочие промежуточные узлы умеют правильно понимать QUERY. Незнакомый метод обычно скорее всего закэнселят по по allowlist'у.
Но кое-что можно придумать:
1️⃣ Во-первых, можно делать фоллбэк на обычный стандартный POST: не получилось QUERY, ловишь 405 или сетевую ошибку и повторяешь POST'ом на тот же эндпоинт. Собрал демку, где это видно вживую: тумблер включает злой прокси, тот режет QUERY, фронт молча уезжает на POST.
2️⃣ Во-вторых, если хочется общаться между сервисами, то QUERY можно брать уже сейчас: там вы контролируете среду выполнения целиком. Так что в межсервисных взаимодействиях ни в чем себе не отказывайте. Если вы, конечно, еще отказываете.
Есть идейка попробовать реализовать схемку с фоллбэком на рабочем проекте: сначала QUERY, не получилось, фоллбэк на POST. А потом посмотреть статистику, сколько запросов реально проходит с QUERY, а сколько нет.
Но это если будет свободное время, а его, скорее всего, не будет. 🍾 Но вдруг кто-то поставит такой эксперимент, было бы очень интересно посмотреть на цифры.
Кстати, у нас есть технопосиделка и для нее я быстренько навайбкодил презу про QUERY. Делюсь с вами. Вдруг удобнее пролистать всё это слайдами.
👋 Ну и заделитесь постом с коллегами, мне кажется что среди дотнетных каналов мало как-то уделено времени столь легендарному событию!
#csharp #dotnet #http
Двадцать лет индустрия пытается ответить на главный вопрос жизни, вселенной и всего такого. А именно: как посылать сложные запросы?
Потому что если посылать GET, то у него есть ограничения по длине. К примеру Nginx по умолчанию рубит строку запроса на 8 КБ. Плюс тело у GET семантически не определено: ты можешь его положить, но его по дороге могут не передать.
Двадцать лет индустрия отвечала на этот вопрос: 4️⃣ 2️⃣
И вот наконец в этом году стала отвечать 6️⃣7️⃣
Ладно, это все шутки. На самом деле предлагалось взять метод POST, который создан совсем для другого, и заворачивать все в него, и в общем это так и работает.
Минусы у этого подхода вот такие. POST по своей сути не идемпотентный. Словил таймаут, повторить не можешь (ну если следовать правилам): вдруг оно там уже что-то создало. Закэшировать тоже нельзя. На редиректе метод может схлопнуться в GET вместе с телом. Ну и в логах с трейсами твой поиск по каталогу выглядит как запись в БД.
📬 Но! НО! буквально на днях мы дожили. В июне 2026 приняли RFC 10008, и стал доступен новый метод: QUERY. Тело как у POST, семантика как у GET. Идемпотентный и кэшируемый.
Вообще, для меня это шок. Я вообще такого, мне кажется, никогда не видел. Может, я просто не следил и новые методы появляются постоянно? Не знаю, но я вижу это в первый раз. И это прикольно.
Теперь про дотнет. Десятка метод уже поддерживает: HttpMethod.Query на клиенте, HttpMethods.Query и IsQuery() на сервере, Kestrel умеет его парсить.
На пояснительно дикпике можно ознакомиться с тем, как выглядит все это на посылку и на прием 🍆
Пока что MapQuery() для minimal API и [HttpQuery] для контроллеров недоступны, обещают вернуться в .NET 11-й. Но мне кажется что не проблема написать свой экстеншен метод, если будет нужно.
Это все круто, но как вы понимаете в этой бочке дёгтя все вышеперечисленной было лишь чайной ложечкой мёда.
🔞 Использовать не получится еще лет 20: не все маршрутизаторы, устройства, вафы и прочие промежуточные узлы умеют правильно понимать QUERY. Незнакомый метод обычно скорее всего закэнселят по по allowlist'у.
Но кое-что можно придумать:
1️⃣ Во-первых, можно делать фоллбэк на обычный стандартный POST: не получилось QUERY, ловишь 405 или сетевую ошибку и повторяешь POST'ом на тот же эндпоинт. Собрал демку, где это видно вживую: тумблер включает злой прокси, тот режет QUERY, фронт молча уезжает на POST.
2️⃣ Во-вторых, если хочется общаться между сервисами, то QUERY можно брать уже сейчас: там вы контролируете среду выполнения целиком. Так что в межсервисных взаимодействиях ни в чем себе не отказывайте. Если вы, конечно, еще отказываете.
Есть идейка попробовать реализовать схемку с фоллбэком на рабочем проекте: сначала QUERY, не получилось, фоллбэк на POST. А потом посмотреть статистику, сколько запросов реально проходит с QUERY, а сколько нет.
Но это если будет свободное время, а его, скорее всего, не будет. 🍾 Но вдруг кто-то поставит такой эксперимент, было бы очень интересно посмотреть на цифры.
Кстати, у нас есть технопосиделка и для нее я быстренько навайбкодил презу про QUERY. Делюсь с вами. Вдруг удобнее пролистать всё это слайдами.
👋 Ну и заделитесь постом с коллегами, мне кажется что среди дотнетных каналов мало как-то уделено времени столь легендарному событию!
#csharp #dotnet #http
- 👍 2
- 🔥 1
- 💘 1












