web-dev-qa-db-fra.com

Elasticearch GET request avec corps de requête

N'est-ce pas contraire à l'approche de style REST de passer un corps de requête avec une requête GET?

Par exemple, pour filtrer certaines informations dans Elasticsearch

curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'

certains outils sont même conçus pour éviter le corps de la requête dans la requête GET (comme le facteur)

17
yurko

Depuis le RFC :

Une charge utile dans un message de demande GET n'a pas de sémantique définie; l'envoi d'un corps de charge utile sur une demande GET peut entraîner le rejet de la demande par certaines implémentations existantes.

En d'autres termes, ce n'est pas interdit, mais c'est un comportement indéfini et doit être évité. Les clients HTTP, les serveurs et les proxys sont libres de laisser tomber le corps et cela ne serait pas contraire à la norme. C'est absolument une mauvaise pratique.

Texte supplémentaire du groupe de travail HTTPBis (le groupe travaillant sur HTTP et les normes connexes):

Enfin, notez que bien que HTTP autorise les requêtes GET à avoir un corps syntaxiquement, cela n'est fait que pour permettre aux analyseurs d'être génériques; selon RFC7231, Section 4.3.1, un corps sur un GET n'a aucune signification et sera soit ignoré soit rejeté par le logiciel HTTP générique.

source

8
Evert

Non ce n'est pas.

Dans REST, l'utilisation de POST pour interroger n'a pas de sens. POST est censé modifier le serveur. Lors de la recherche, vous ne modifiez évidemment pas le serveur.

GET s'applique ici très bien.

Par exemple, quelle serait la différence de lancer une recherche avec:

GET /_search?q=foo

contre

GET /_search
{
  "query": {
    "query_string": {
      "query" : "foo"
    }
  }
}

Dans les deux cas, vous souhaitez "OBTENIR" certains résultats. Vous ne voulez pas changer aucun état côté serveur.

C'est pourquoi je pense que GET est totalement applicable ici que vous passiez la requête dans l'URI ou que vous utilisiez un corps.

Cela étant dit, nous sommes conscients que certains langages et outils ne le permettent pas. Bien que le RFC ne mentionne pas que vous ne pouvez pas avoir un corps avec GET.

Elasticsearch prend donc également en charge POST.

Cette:

curl -XPOST localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'

Fonctionnera de la même manière.

11
dadoonet