<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="The HTTP QUERY Method" num="10008" status="standards"
	 wg="httpbis"> 
  <authors><author>J. Reschke (greenbytes)</author><author>J.M. Snell
  (Cloudflare)</author><author>M. Bishop (Akamai)</author></authors>
  <rfcdate><month>June</month><year>2026</year></rfcdate>
  <date>2026-06-16</date>
<content>
  <p>Ce n'est pas tous les jours qu'on normalise une nouvelle méthode
  <wikipedia name="Hypertext Transfer
  Protocol">HTTP</wikipedia>. Bienvenue, donc, à QUERY, qui rejoint
  des méthodes bien plus anciennes comme GET et POST. QUERY peut être
  décrit comme « GET mais avec un corps dans la requête ». Comme GET,
  elle est <wikipedia name="Idempotence">idempotente</wikipedia> et donc sûre à répéter.</p>
  <p>L'idée est de pouvoir interroger, par exemple, un service de
  recherche (vous verrez un exemple plus loin sur mon blog). Sans
  QUERY, on envoyait quelque chose du genre :
  <code>
<![CDATA[    
GET /feed?q=foo&limit=10&sort=published HTTP/1.1    
]]>
  </code>
  On est donc obligés de mettre les paramètres dans l'<wikipedia
  name="Uniform Resource Locator">URL</wikipedia>. Cela peut poser
  problème si les paramètres sont nombreux et de grande taille, cela
  oblige à les <wikipedia name="Encodage-pourcent">pourcent-encoder</wikipedia> et cela peut
  poser des problèmes de <wikipedia>vie privée</wikipedia> (l'URL
  demandé a des chances d'être enregistré dans un
  <wikipedia name="Historique (informatique)">journal</wikipedia>).</p>
  <p>Des gens utilisent donc POST pour une recherche, bien qu'il
  n'ait pas la bonne sémantique :
  <code>
<![CDATA[    
POST /feed HTTP/1.1

q=foo&limit=10&sort=published
]]>
  </code>
  Mais on ne voit plus que la requête est
  <wikipedia name="Idempotence">idempotente</wikipedia>. Un navigateur Web n'osera pas la
  répéter ou bien demandera confirmation à l'utilisateur. Et on ne
  pourra pas facilement mémoriser le résultat (puisque le client ne
  sait pas si la requête n'a pas d'effets de bord). QUERY résout le
  problème :
  <code>
<![CDATA[    
QUERY /feed HTTP/1.1

q=foo&limit=10&sort=published
]]>
  </code>
  La méthode est idempotente, le résultat peut être mémorisé.
  </p>
  <p>La section 2 du RFC décrit avec précision QUERY. À lire si vous
  écrivez des clients ou des serveurs qui l'utilisent. Par exemple,
  puisque QUERY, contrairement à GET, inclut un corps dans la requête,
  le client doit indiquer le type de média utilisé, et sans se
  tromper, sinon le serveur lui renverra un 400. (Et un 415 si le type
  est bien là mais que le serveur ne le connait pas.) Autre chose à
  noter : en cas de redirection, le client ne doit pas changer de
  méthode (alors qu'on pouvait changer un POST en GET si la
  redirection était faite avec 301 ou 302). Autrement, QUERY ressemble
  beaucoup dans son comportement à GET. QUERY est désormais enregistré
  dans <link
  url="https://www.iana.org/assignments/http-methods/http-methods.xml#methods">le
  registre des méthodes HTTP</link>.</p>
  <p>Un serveur HTTP qui met en œuvre QUERY n'accepte pas forcément
  n'importe quel format en entrée. Pour documenter ce qu'il accepte
  comme corps de la requête, notre RFC introduit un <link
  url="https://www.iana.org/assignments/http-fields/http-fields.xml#field-names">nouveau
  champ HTTP</link>, <computer>Accept-Query:</computer> (section 3)
  qui est la liste des <wikipedia name="Type de médias">types de média</wikipedia>
  acceptés.</p>
  <p>Vous avez plein d'exemples de requêtes et de réponses dans
  l'annexe A.</p>
  <p>Il y a une mise en œuvre de QUERY sur ce blog, pour fournir un
  <link local="moteur-recherche">moteur de recherche</link> des
  articles. L'<wikipedia name="Uniform Resource
  Locator">URL</wikipedia> est
  <computer>https://www.bortzmeyer.org/methodquery</computer> et voici
  un exemple d'utilisation avec <wikipedia
  name="cURL">curl</wikipedia> :
  <code>
% curl --request QUERY --data query=framasoft https://www.bortzmeyer.org/methodquery 

    Query of "framasoft" OK

    https://www.bortzmeyer.org/capitole-du-libre-2023.html "Capitole du Libre 2023, et mon exposé sur la censure de l'Internet"
    …
  </code>
  Vous pouvez avoir une documentation plus détaillée de ce service
  au début de son code source (en <wikipedia name="Python (langage)">Python</wikipedia>),
  <computer><file name="method-query.py"/></computer>. D'autre part, si vous
  n'aimez pas curl et que vous préférez un programme en Python,
  essayez ce client : <computer><file
  name="test-http-query.py"/></computer>. (Par contre, pas de
  <wikipedia name="Formulaire HTML">formulaire Web</wikipedia> pour utiliser ce service, car
  je ne connais pas de navigateur qui gère QUERY.)
  </p>
  <p>En parlant de curl, notez que, lorsqu'il suit
  une redirection HTTP (option <computer>--location</computer>), il ne
  transmet pas <link
  url="https://github.com/curl/curl/pull/16543">actuellement</link> le corps de la requête, ce qui casse ce service.</p>
  <p>La création de cette nouvelle méthode (ce qui est rare, je crois
  que la précédente avait été PATCH dans le <rfc num="5789"
  local="true"/> il y a quinze ans) a pris du temps. Le premier projet
  avait été <link
  url="https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/">rédigé
  en 2015</link> et le travail a connu plusieurs interruptions. Une
  des discussions <link url="https://github.com/httpwg/http-extensions/issues/1614">avait porté sur le nom de la méthode</link>, qui aurait pu
  s'appeler SEARCH (réutilisant une méthode normalisée dans le <rfc
  num="5323" local="false"/>). L'annexe B du RFC discute le choix qui
  a été fait.</p>
  <p>Une autre discussion portait sur le code de retour HTTP, un
  problème classique de tous les services tournant sur HTTP : si la
  requête est bien transmise et traitée mais qu'on n'a pas de
  résultat, doit-on quand même renvoyer le 200, qui signifie que tout
  s'est bien passé ? Avec GET, on utilise souvent 404 dans ce cas,
  mais c'est parce que le terme de recherche est dans l'URL, ce qui
  n'est plus le cas ici. On aurait pu aussi avoir un nouveau code
  commençant par 2. Finalement, le choix a été de renvoyer 200 quand
  la requête est bien arrivée et que le moteur de recherche a
  fonctionné, même s'il n'a rien trouvé. (Une discussion analogue
  avait eu lieu pendant le développement de
  <wikipedia name="DNS over HTTPS">DoH</wikipedia>. Le <rfc num="8484" local="true"/> avait
  finalement décidé de répondre 200 même si le <wikipedia name="Nom de
  domaine">nom de domaine</wikipedia> demandé n'existait pas.)</p>
  <p>Ah, et si vous voulez <wikipedia name="Supervision (informatique)">superviser</wikipedia> votre
  service HTTP utilisant QUERY, le <link url="https://www.monitoring-plugins.org/doc/man/check_http.html">programme check_http</link> des
  <foreign><link url="https://www.monitoring-plugins.org/" >monitoring plugins</link></foreign> le
  permet. Voici un exemple de configuration pour <wikipedia xml:lang="en">Icinga</wikipedia> :
<code>
vars.http_vhosts["query"] = {
    http_uri = "/methodquery"
    http_vhost = "www.bortzmeyer.org"
    http_ssl = true
    http_sni = true
    http_method = "QUERY"
    # Notez que le nom de la variable n'est pas très heureux.
    http_post = "query=foobar"
    http_content_type = "application/x-www-form-urlencoded"
    http_string = "foobar\" OK"
    http_timeout = 15
}
</code>
</p> 
</content>
</rfcdesc>
