Инженерният комитет 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
> Приемайте: application/json
> select=surname,givenname,email&limit=10&match="email=*@example.*"
HTTP/1.1 200 OK
Съдържание-Тип: application/json
Съдържание-Локация: /contacts/stored-results/17
Локация: /contacts/stored-queries/42
Последно променено: събота, 25 август 2012 23:34:45 GMT
Дата: неделя, 17 ноември 2024, 16:10:24 GMT
> GET /contacts/stored-results/17 HTTP/1.1
> Host: example.org
> Приемайте: 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
Съдържание-Тип: application/xhtml
Приемане-Запитване: application/x-www-form-urlencoded, application/jsonpath, application/sql
> QUERY /errata.json HTTP/1.1
> Host: example.org
> Съдържание-Тип: application/jsonpath
> Приемайте: application/json
>
> $..[
> ?@.errata_status_code==»Отхвърлено»
> && @.submit_date>»2024″
> ]
> [«doc-id»]
Източник: opennet.ru
