LINUX.ORG.RU

Стандартизирован HTTP-метод QUERY, комбинирующий возможности GET и POST

 , , ,


1

4

Инженерный комитет IETF (Internet Engineering Task Force), занимающийся развитием протоколов и архитектуры сети Интернет, придал HTTP-методу QUERY статус «Предложенного стандарта» и опубликовал связанную с ним спецификацию RFC 10008. Метод QUERY по способу отправки данных на сервер повторяет метод POST, но отличается от него ориентацией не на запись данных и изменение состояния, а на формирование запросов на чтение.

По решаемым задачам новый метод близок к GET и позволят отправлять запросы, которые могут быть повторены или перезапущены без изменения состояния на сервере. Как и в методе POST параметры запроса в QUERY передаются не в URI, а в теле запроса. Подобный подход даёт возможность передавать большой объём параметров в запросе, превышающий лимит на размер параметров в методе GET (8000 байт).

GET /feed?q=foo&limit=10&sort=-published HTTP/1.1
Host: example.org

QUERY /feed HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded

q=foo&limit=10&sort=-published

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

Среди областей применения метода QUERY упоминается отправка запросов к Web API, выдающих результат в формате JSON или XML, или бэкендам, генерирующим контент. Для определения возможности использования нового метода при обращении к серверу предлагается использовать метод OPTIONS, а для определения поддерживаемых форматов метод HEAD:

> OPTIONS /contacts HTTP/1.1
> Host: example.org

HTTP/1.1 200 OK
Allow: GET, QUERY, OPTIONS, HEAD

В методе QUERY предусмотрена поддержка кэширования — прокси-серверы или обработчики могут сохранить результат выполнения запроса, присвоить ему URI для последующего обращения через метод GET и вернуть информацию о выдаче прокэшированной версии через заголовок Last-Modified. Для проверки наличия изменений с прошлого запроса может применяться заголовок If-Modified-Since. Для указания альтернативных вариантов выполнения запроса в ответе могут указываться заголовки Content-Location и Location, отличия которых в том, что первый передаёт ссылку для получения результата ранее выполненного запроса, а второй предназначен для повторения запроса с теми же параметрами:

> QUERY /contacts HTTP/1.1
> Host: example.org
> Content-Type: application/x-www-form-urlencoded
> Accept: application/json
> select=surname,givenname,email&limit=10&match=%22email=*@example.*%22

HTTP/1.1 200 OK
Content-Type: application/json
Content-Location: /contacts/stored-results/17
Location: /contacts/stored-queries/42
Last-Modified: Sat, 25 Aug 2012 23:34:45 GMT
Date: Sun, 17 Nov 2024, 16:10:24 GMT

> GET /contacts/stored-results/17 HTTP/1.1
> Host: example.org
> Accept: application/json

Помимо типа application/x-www-form-urlencoded для передачи параметров в запросах QUERY также могут напрямую использоваться расширенные форматы, такие как JSONPath (application/jsonpath), XSLT (application/xslt+xml) и SQL (application/sql). Поддерживаемые форматы возвращаются сервером в заголовке Accept-Query.

> HEAD /contacts HTTP/1.1
> Host: example.org

HTTP/1.1 200 OK
Content-Type: application/xhtml
Accept-Query: application/x-www-form-urlencoded, application/jsonpath, application/sql

> QUERY /errata.json HTTP/1.1
> Host: example.org
> Content-Type: application/jsonpath
> Accept: application/json
>
> $..[
>     ?@.errata_status_code=="Rejected"
>     && @.submit_date>"2024"
>   ]
>   ["doc-id"]

>>> Источник: OpenNET

★★★★★

Проверено: maxcom ()
Ответ на: комментарий от aboite

Браузеры будут копировать этот код неявно, но вместе с ссылкой/адресом сайта.

Так для этого всё равно придётся к адресу добавлять. Или придумывать строковое представление с двумя полями. Что-то ведь надо в адресную строку ввести, чтобы этот QUERY получить.

Получим скрытый канал чего угодно в обход ведома пользователя.

QR уже есть.

monk ★★★★★
()
Ответ на: комментарий от monk

В html

<a href="site.com" query="fglkggw8845oit60w63h4mjgog8434k"></a>

В строке браузера уже в буфере будет

А в текстовый редактор что-нибудь когда-то зарезервированное откопают, и прилетит наподобие

site.com/#!fglkggw8845oit60w63h4mjgog8434k
aboite
()
Ответ на: комментарий от aboite

И чем он скрытый? В адресе всё видно.

В принципе и сейчас можно писать

site.com?query=fglkggw8845oit60w63h4mjgog8434k

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

monk ★★★★★
()
Ответ на: комментарий от monk

Поле сделают очень массивным, неумещающимся в форме юникода/url; бинарным, попросту. Впоследствии всякие текстовые редакторы/компоненты тоже будут следовать стандарту, снабжая каждую ссыль скрытыми аттрибутами, так как явление приобретёт массовый характер - люди же в браузерах сидят. Попутно пользователю будут рисовать красивый [товары и услуги | товары | скатерть (гжель, синяя) ], который им очень понравится… а в служебной инфе будет скупой ref-id и куча всего дополнительного. Хехехе.

aboite
()
Ответ на: комментарий от monk

В принципе и сейчас можно писать

Ну так чтобы прежнее не ломать, будет новое. Старые ссылки с «визуальным мусором» будут применяться всё реже. Останутся только QUERY.

aboite
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.