Question HTTP GET avec le corps de la requête


Je développe un nouveau service web RESTful pour notre application.

Lorsque vous faites un GET sur certaines entités, les clients peuvent demander le contenu de l'entité. S'ils veulent ajouter des paramètres (par exemple trier une liste), ils peuvent ajouter ces paramètres dans la chaîne de requête.

Sinon, je veux que les gens puissent spécifier ces paramètres dans le corps de la requête. HTTP / 1.1 ne semble pas interdire explicitement cela. Cela leur permettra de spécifier plus d'informations, ce qui pourrait faciliter la spécification de requêtes XML complexes.

Mes questions:

  • Est-ce une bonne idée?
  • Les clients HTTP auront-ils des problèmes avec l'utilisation de corps de requête dans une requête GET?

http://tools.ietf.org/html/rfc2616


1410
2018-06-10 20:47


origine


Réponses:


Commentaire de Roy Fielding sur l'inclusion d'un corps avec une requête GET.

Oui. En d'autres termes, tout message de requête HTTP est autorisé à contenir   un corps de message, et doit donc analyser les messages dans cet esprit.   La sémantique du serveur pour GET, cependant, est restreinte de telle sorte qu'un corps,   le cas échéant, n'a pas de signification sémantique à la demande. Les exigences   sur l'analyse sont distincts des exigences sur la sémantique de la méthode.

Donc, oui, vous pouvez envoyer un corps avec GET, et non, ce n'est jamais utile   faire cela.

Cela fait partie de la conception en couches de HTTP / 1.1 qui deviendra   effacer à nouveau une fois que la spécification est partitionnée (travail en cours).

.... Roy

Oui, vous pouvez envoyer un corps de requête avec GET mais cela ne devrait pas avoir de sens. Si vous lui donnez un sens en l'analysant sur le serveur et changer votre réponse en fonction de son contenu, alors vous ignorez cette recommandation dans la spécification HTTP / 1.1, section 4.3:

[...] si la méthode de requête      n'inclut pas de sémantique définie pour un corps d'entité, alors      Corps du message DEVRAIT être ignoré lors de la gestion de la demande.

Et la description de la méthode GET dans la spécification HTTP / 1.1, section 9.3:

La méthode GET signifie récupérer toutes les informations ([...]) identifiées par l'URI de la demande.

qui indique que le corps de la demande ne fait pas partie de l'identification de la ressource dans une requête GET, seulement l'URI de la requête.


1200
2018-06-11 20:27



Pendant que tu pouvez Pour ce faire, dans la mesure où cela n'est pas explicitement exclu par la spécification HTTP, je suggère de l'éviter simplement parce que les gens ne s'attendent pas à ce que les choses fonctionnent de cette façon. Il y a beaucoup de phases dans une chaîne de requêtes HTTP et même si elles sont "pour la plupart" conformes à la spécification HTTP, la seule chose que vous êtes assuré est qu'elles se comporteront comme elles sont traditionnellement utilisées par les navigateurs web. (Je pense à des choses comme les proxies transparents, les accélérateurs, les boîtes à outils A / V, etc.)

C'est l'esprit derrière le Principe de robustesse À peu près «soyez libéral dans ce que vous acceptez, et conservateur dans ce que vous envoyez», vous ne voulez pas repousser les limites d'une spécification sans raison valable.

Cependant, si vous avez une bonne raison, allez-y.


234
2018-06-10 20:53



Vous rencontrerez probablement des problèmes si vous essayez de profiter de la mise en cache. Les proxys ne vont pas regarder dans le corps GET pour voir si les paramètres ont un impact sur la réponse.


116
2018-06-10 21:10



Ni restclient ni Console REST soutenir cela, mais boucle.

le Spécification HTTP dit à la section 4.3

Un corps de message NE DOIT PAS être inclus dans une requête si la spécification de la méthode de requête (section 5.1.1) n'autorise pas l'envoi d'un corps d'entité dans les requêtes.

Section 5.1.1 nous redirige vers la section 9.x pour les différentes méthodes. Aucun d'entre eux n'interdit explicitement l'inclusion d'un corps de message. Toutefois...

Section 5.2 dit

La ressource exacte identifiée par une requête Internet est déterminée en examinant à la fois les champs d'en-tête Request-URI et Host.

et Section 9.3 dit

La méthode GET signifie récupérer toutes les informations (sous la forme d'une entité) identifiées par l'URI de demande.

Qui ensemble suggèrent que lors du traitement d'une requête GET, un serveur n'est pas Champs obligatoires examiner tout autre que le champ d'en-tête Request-URI et Host.

En résumé, la spécification HTTP ne vous empêche pas d'envoyer un message-body avec GET mais il y a suffisamment d'ambiguïté pour ne pas me surprendre si elle n'était pas supportée par tous les serveurs.


60
2018-03-27 10:41



Elasticsearch accepte les requêtes GET avec un corps. Il semble même que c'est la façon préférée: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/common-options.html#_request_body_in_query_string

Certaines bibliothèques client (comme le pilote Ruby) peuvent enregistrer la commande cry sur stdout en mode développement et utilisent cette syntaxe de manière extensive.


36
2017-12-03 11:15



Ce que vous essayez d'accomplir a été fait depuis longtemps avec une méthode beaucoup plus commune, et une qui ne compte pas sur l'utilisation d'une charge utile avec GET.

Vous pouvez simplement créer votre médiatype de recherche spécifique, ou si vous voulez être plus RESTful, utilisez quelque chose comme OpenSearch, et POSTEZ la requête à l'URI que le serveur a demandé, par exemple / search. Le serveur peut ensuite générer le résultat de la recherche ou créer l'URI final et rediriger en utilisant un 303.

Cela a l'avantage de suivre la méthode PRG traditionnelle, aide les intermédiaires de cache à mettre en cache les résultats, etc.

Cela dit, les URI sont codées de toute façon pour tout ce qui n'est pas ASCII, tout comme application / x-www-form-urlencoded et multipart / form-data. Je recommande d'utiliser ceci plutôt que de créer un autre format json personnalisé si votre intention est de prendre en charge les scénarios ReSTful.


25
2018-06-10 22:47



Quel serveur va l'ignorer? - Fijiaaron 30 août 12 à 21:27

Google par exemple fait pire que de l'ignorer, il considérera comme un Erreur!

Essayez-le vous-même avec un netcat simple:

$ netcat www.google.com 80
GET / HTTP/1.1
Host: www.google.com
Content-length: 6

1234

(le contenu 1234 est suivi par CR-LF, soit un total de 6 octets)

et vous obtiendrez:

HTTP/1.1 400 Bad Request
Server: GFE/2.0
(....)
Error 400 (Bad Request)
400. That’s an error.
Your client has issued a malformed or illegal request. That’s all we know.

Vous recevez aussi 400 Bad Request de Bing, Apple, etc ... qui sont servis par AkamaiGhost.

Je ne conseillerais donc pas d'utiliser des requêtes GET avec une entité body.


23
2018-06-29 21:26