Das Ingenieurkomitee IETF (Internet Engineering Task Force), das an der Entwicklung von Protokollen und der Architektur des Internets arbeitet, hat der HTTP-Methode QUERY den Status "Vorgeschlagener Standard" verliehen und die dazugehörige Spezifikation RFC 10008 veröffentlicht. Die QUERY-Methode ähnelt in der Art der Datenübertragung der POST-Methode, unterscheidet sich jedoch dadurch, dass sie sich nicht auf das Schreiben von Daten und die Änderung des Zustands konzentriert, sondern darauf, Abfragen zum Lesen zu formulieren.
In Bezug auf die zu lösenden Aufgaben ähnelt die neue Methode GET und ermöglicht das Senden von Anfragen, die ohne Zustandsänderung auf dem Server wiederholt oder neu gestartet werden können. Wie bei der POST-Methode werden die Abfrageparameter in QUERY nicht im URI, sondern im Anfragekörper übermittelt. Dieser Ansatz erlaubt es, eine große Menge an Parametern im Anfrageformular zu übertragen, die die Größenbeschränkung für Parameter in der GET-Methode (8000 Bytes) überschreitet.
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
Über den QUERY-Method gesendete Parameter erscheinen nicht in den Protokollen Server, was einerseits die Analyse von Anfragen und die Diagnose von Problemen erschwert, andererseits aber die Möglichkeit bietet, vertrauliche Daten aus den Proxiserver-Logs zu verbergen.
Zu den Anwendungsbereichen der QUERY-Methode gehört das Senden von Anfragen an Web-APIs, die Ergebnisse im JSON- oder XML-Format ausgeben, oder an Backends, die Inhalte generieren. Um herauszufinden, ob die neue Methode für den Zugriff auf Server vorgeschlagen, die OPTIONS-Methode zu verwenden, und zur Bestimmung der unterstützten Formate die HEAD-Methode:
> OPTIONS /contacts HTTP/1.1
> Host: example.org
HTTP/1.1 200 OK
Allow: GET, QUERY, OPTIONS, HEAD
Im QUERY-Verfahren wird die Unterstützung von Caching bereitgestellt – Proxy-Server oder Handler können das Ergebnis einer Anfrage speichern, ihm eine URI zuweisen, um später über die GET-Methode darauf zuzugreifen, und Informationen zur Ausgabe der zwischengespeicherten Version über den Header „Last-Modified“ zurückgeben. Um Änderungen seit der letzten Anfrage zu überprüfen, kann der Header „If-Modified-Since“ verwendet werden. Für die Angabe alternativer Ausführungsvarianten einer Anfrage können die Header „Content-Location“ und „Location“ im Antwortformat angegeben werden. Der Unterschied zwischen ihnen besteht darin, dass der erste einen Link zur Verfügung stellt, um das Ergebnis einer früheren Anfrage zu erhalten, während der zweite dazu dient, die Anfrage mit denselben Parametern zu wiederholen.
> 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=email=*@example.*
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
Neben dem Typ „application/x-www-form-urlencoded“ können auch erweiterte Formate wie JSONPath (application/jsonpath), XSLT (application/xslt+xml) und SQL (application/sql) direkt für die Übertragung von Parametern in QUERY-Anfragen verwendet werden. Die unterstützten Formate werden dem Server durch im Accept-Query-Header zurückgegeben.
> 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“]
Quelle: opennet.ru
