Inženjerski odbor IETF (Internet Engineering Task Force), koji se bavi razvojem protokola i arhitekture interneta, dodijelio je HTTP metodi QUERY status "Prijedlog standarda" i objavio povezanu specifikaciju RFC 10008. Metoda QUERY po načinu slanja podataka na poslužitelj ponavlja metodu POST, ali se razlikuje od nje u tome što nije usmjerena na unos podataka i promjenu stanja, već na formiranje zahtjeva za čitanje.
U odnosu na riješene zadatke, nova metoda je slična GET-u i omogućava slanje zahtjeva koji se mogu ponoviti ili ponovno pokrenuti bez mijenjanja stanja na poslužitelju. Kao i u metodi POST, parametri zahtjeva u QUERY-u ne šalju se u URI, već u tijelu zahtjeva. Ovaj pristup omogućuje prijenos velike količine parametara u zahtjevu, premašujući limit veličine parametara u metodi GET (8000 bajtova).
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
Parametri poslani putem metode QUERY ne odražavaju se u zapisnicima poslužitelja, što s jedne strane otežava analizu zahtjeva i dijagnostiku problema, ali s druge strane omogućava skrivanje povjerljivih podataka iz zapisnika posredničkih poslužitelja.
Među područjima primjene metode QUERY spominje se slanje zahtjeva prema Web API-ju, koji vraćaju rezultate u formatu JSON ili XML, ili backendovima koji generiraju sadržaj. Za određivanje moguća korištenja nove metode pri pristupu poslužitelju preporučuje se koristiti metodu OPTIONS, a za određivanje podržanih formata metodu HEAD:
> OPTIONS /contacts HTTP/1.1
> Host: example.org
HTTP/1.1 200 OK
Allow: GET, QUERY, OPTIONS, HEAD
U metodi QUERY predviđena je podrška za кеширање — posrednički poslužitelji ili obrada mogu pohraniti rezultat izvršenja zahtjeva, dodijeliti mu URI za kasnije pozivanje putem metode GET i vratiti informacije o dodjeli keširane verzije putem zaglavlja "Last-Modified". Za provjeru promjena od posljednjeg zahtjeva može se koristiti zaglavlje "If-Modified-Since". Za naznačavanje alternativnih opcija izvršenja zahtjeva mogu se koristiti zaglavlja "Content-Location" i "Location", čija je razlika u tome što prvo predaje vezu za dobivanje rezultata prethodno izvršenog zahtjeva, dok je drugo namijenjeno ponovnom izvršavanju zahtjeva s istim parametrima.
> QUERY /contacts HTTP/1.1
> Host: example.org
> Content-Type: application/x-www-form-urlencoded
> Prihvatiti: application/json
> odaberi=prezime,ime,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: Sub, 25 Kol 2012 23:34:45 GMT
Date: Ned, 17 Stu 2024, 16:10:24 GMT
> GET /contacts/stored-results/17 HTTP/1.1
> Host: example.org
> Prihvatiti: application/json
Osim tipa «application/x-www-form-urlencoded» za prijenos parametara u QUERY zahtjevima mogu se izravno koristiti i nadograđeni formati, kao što su JSONPath (application/jsonpath), XSLT (application/xslt+xml) i SQL (application/sql). Podržani formati vraćaju se serverom u headeru 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
> Prihvatiti: application/json
>
> $..[
> ?@.errata_status_code==»Rejected»
> && @.submit_date>»2024″
> ]
> [«doc-id»]
Izvor: opennet.ru
