web-dev-qa-db-fra.com

Les méthodes HTTP POST) envoient-elles des données sous forme de chaîne de requête?

Je voudrais savoir si la méthode POST sur HTTP envoie des données sous forme de chaîne de requête) ou si elle utilise une structure spéciale pour transmettre les données au serveur.

En fait, lorsque j'analyse la communication avec la méthode POST d'un client à un serveur (avec Fiddler, par exemple)), je ne vois aucune chaîne QueryString, mais un contexte de corps de formulaire avec les paires nom/valeur. .

52
kwichz

La meilleure façon de visualiser cela consiste à utiliser un analyseur de paquet tel que Wireshark et suivez le flux TCP) . HTTP utilise simplement TCP pour envoyer un flux de données commençant par quelques lignes d’en-têtes HTTP. Ces données sont souvent faciles à lire car elles consistent en HTML, CSS ou XML, mais il peut s'agir de tout type de données transférées. sur Internet (fichiers exécutables, images, vidéos, etc.).

Pour une demande GET, votre ordinateur demande une URL spécifique et le serveur Web répond généralement avec un code d'état 200 et le contenu de la page Web est envoyé directement après les en-têtes de réponse HTTP. Ce contenu est identique à celui que vous verriez si vous visualisiez la source de la page Web dans votre navigateur. La chaîne de requête que vous avez mentionnée ne représente qu'une partie de l'URL et est incluse dans l'en-tête de requête HTTP GET envoyé par votre ordinateur au serveur Web. Vous trouverez ci-dessous un exemple de requête HTTP GET à http://accel91.citrix.com:8000/OA_HTML/OALogout.jsp?menu=Y , suivie d'une réponse de redirection 302 du serveur. Certains en-têtes HTTP sont encapsulés en raison de la taille de la fenêtre d’affichage (ils ne prennent en réalité qu’une ligne), et la redirection 302 inclut une simple page Web HTML avec un lien vers la page Web redirigée (la plupart des navigateurs redirigent automatiquement toute réponse 302 à l'URL indiquée dans l'en-tête Location au lieu d'afficher la réponse HTML):

HTTP GET with 302 redirect

Pour une demande POST, vous pouvez toujours avoir une chaîne de requête, mais elle est rare et n'a rien à voir avec les données que vous postez. Les données sont incluses directement après la En-têtes HTTP que votre navigateur envoie au serveur, similaires à la réponse 200 utilisée par le serveur Web pour répondre à une demande GET. Dans le cas de la publication d'un formulaire Web simple, ces données sont codées à l'aide du même codage d'URL utilisé par une chaîne de requête, mais si vous utilisez un service Web SOAP, il peut également être codé à l'aide d'un format MIME en plusieurs parties et données XML .

Par exemple, voici ce qu'un HTTP POST à un service Web basé sur XML SOAP situé sur http://192.168.24.23:8090/msh ressemble à Wireshark Follow TCP Stream :

HTTP POST TCP Stream

51
Greg Bray

Post utilise le corps du message pour renvoyer les informations au serveur, contrairement à Get, qui utilise la chaîne de requête (tout ce qui suit le point d'interrogation). Il est possible d'envoyer à la fois une chaîne de requête Get et un corps de message Post dans la même demande, mais cela peut être un peu déroutant et il vaut donc mieux éviter cela.

En règle générale, il est recommandé d'utiliser Get lorsque vous souhaitez récupérer des données et Post lorsque vous souhaitez les modifier. (Ces règles ne sont pas immuables, les spécifications n'interdisent pas la modification de données avec Get, mais il est généralement évité sous prétexte que vous ne voulez pas que les gens apportent des modifications simplement en cliquant sur un lien ou en tapant une URL.)

Inversement, vous pouvez utiliser Post pour récupérer des données sans les modifier, mais avec Get, vous pouvez marquer la page avec des signets ou partager l’URL avec d’autres personnes. Ce que vous ne pourriez pas faire si vous aviez utilisé Post.

En ce qui concerne le format réel des données envoyées dans le corps du message, cela dépend entièrement de l'expéditeur et est spécifié avec le Content-Type entête. Si non spécifié, le type de contenu par défaut pour les formulaires HTML est application/x-www-form-urlencoded, ce qui signifie que le serveur s'attend à ce que le corps de la publication soit une chaîne codée de la même manière qu'une chaîne de requête GET. Cependant, cela ne peut pas dépendre de tous les cas. RFC2616 indique ce qui suit dans l'en-tête Content-Type:

Tout message HTTP/1.1 contenant un corps d’entité DEVRAIT inclure un
Champ d’en-tête Content-Type définissant le type de support de ce corps. Si
et que si le type de support n’est pas défini par un champ Content-Type, le
le destinataire PEUT essayer de deviner le type de support en inspectant son type.
contenu et/ou l'extension du nom de l'URI utilisé pour identifier le
Ressource. Si le type de support reste inconnu, le destinataire DEVRAIT
le traite comme type "application/octet-stream".

23
GordonM

A POST request can inclut une chaîne de requête, mais normalement pas - un formulaire HTML standard avec une action POST normalement pas inclure une chaîne de requête par exemple.

17
Justin

GET enverra les données sous forme de chaîne de requête, mais POST ne le fera pas. Au lieu de cela, il l'enverra dans le corps de la demande.

4
ataddeini

Si votre message tente d'atteindre l'URL suivante

mypage.php? id = 1

vous aurez les données POST mais également les données GET).

1
jsgoupil