Инженерният комитет 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
Content-Type: application/json
Content-Location: /contacts/stored-results/17
Location: /contacts/stored-queries/42
Last-Modified: Съб, 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
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
> Приемаме: application/json
>
> $..[
> ?@.errata_status_code=="Rejected"
> && @.submit_date>"2024"
> ]
> ["doc-id"]
Източник: opennet.ru
