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

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

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

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

   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 упоминается использование для отправки запросов к Web API, выдающих результат в формате JSON. Для определения возможности использования нового метода при обращении к серверу предлагается использовать метод 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"]



Источник: http://www.opennet.ru/opennews/art.shtml? num=65713

©  OpenNet