Les méthodes HTTP POST envoient-elles des données en tant que QuerySsortingng?

J’aimerais savoir si la méthode POST sur HTTP envoie des données en tant que QuerySsortingng ou si elle utilise une structure spéciale pour transmettre les données au serveur.

En fait, lorsque j’parsing la communication avec la méthode POST d’un client à un autre (avec Fiddler par exemple), je ne vois aucun QuerySsortingng, mais un contexte de corps de formulaire avec les paires nom / valeur.

La meilleure façon de visualiser ceci est d’utiliser un parsingur de paquets tel que Wireshark et de suivre le stream TCP . HTTP utilise simplement TCP pour envoyer un stream de données en commençant par quelques lignes d’en-têtes HTTP. Souvent, ces données sont faciles à lire car elles sont composées de HTML, CSS ou XML, mais il peut s’agir de n’importe quel type de données transférées sur Internet (exécutables, images, vidéo, 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 le même que 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 n’est qu’une partie de l’URL et est incluse dans l’en-tête de requête HTTP GET que votre ordinateur envoie au serveur Web. Vous trouverez ci-dessous un exemple de requête HTTP GET à l’ adresse http://accel91.cisortingx.com:8000/OA_HTML/OALogout.jsp?menu=Y , suivie d’une réponse de redirection 302 à partir du serveur. Certains en-têtes HTTP sont encapsulés en raison de la taille de la fenêtre d’affichage (ils ne prennent qu’une ligne chacun) et la redirection 302 inclut une page Web HTML simple avec un lien vers la page Web redirigée (la plupart des navigateurs redirectont automatiquement toute réponse 302) à l’URL répertoriée dans l’en-tête Location au lieu d’afficher la réponse HTML):

HTTP GET avec redirection 302

Pour une requête POST, vous pouvez toujours avoir une chaîne de requête, mais cela est rare et n’a rien à voir avec les données que vous êtes en train de poster. Au lieu de cela, les données sont incluses directement après les en-têtes HTTP que votre navigateur envoie au serveur, de la même manière que la réponse 200 que le serveur Web utilise pour répondre à une requête GET. Dans le cas du POST, un simple formulaire Web est codé en utilisant le même codage URL que celui utilisé par une chaîne de requête, mais si vous utilisez un service Web SOAP, il peut également être codé au format MIME et XML .

Par exemple, voici à quoi ressemble un HTTP POST vers un service Web SOAP basé sur XML situé à l’ adresse http://192.168.24.23:8090/msh dans Wireshark Follow TCP Stream :

HTTP TCP POST Stream

Post utilise le corps du message pour renvoyer les informations au serveur, par opposition à Get, qui utilise la chaîne de requête (tout après 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 requête, mais cela peut être un peu compliqué, il est donc préférable de l’éviter.

En règle générale, les meilleures pratiques exigent que vous utilisiez Get lorsque vous souhaitez récupérer des données et Post lorsque vous souhaitez les modifier. (Ces règles ne sont pas figées, les spécifications n’interdisent pas la modification des données avec Get, mais elles sont généralement évitées car vous ne voulez pas que les utilisateurs apportent des modifications en cliquant simplement sur un lien ou en tapant une URL)

À l’inverse, vous pouvez utiliser Post pour récupérer des données sans les modifier, mais l’utilisation de Get signifie que vous pouvez append la page à vos favoris ou partager l’URL avec d’autres personnes, ce que vous ne pouviez 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 l’en Content-Type tête Content-Type . S’il n’est pas 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 du post soit une chaîne similaire à une chaîne de requête GET. Cependant, cela ne peut pas dépendre de tous les cas. RFC2616 dit ce qui suit sur 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 média de ce corps. Si
et seulement si le type de média n’est pas donné par un champ Content-Type, le
le destinataire PEUT tenter de deviner le type de média par inspection de son
contenu et / ou la ou les extensions de nom de l’URI utilisé pour identifier le
Ressource. Si le type de média rest inconnu, le destinataire DEVRAIT
Traitez-le comme type “application / octet-stream”.

Une requête POST peut inclure une chaîne de requête, mais normalement, elle ne le fait pas – un formulaire HTML standard avec une action POST n’inclura normalement pas de chaîne de requête par exemple.

GET enverra les données en tant que chaîne de requête, mais pas POST. Au contraire, il l’enverra dans le corps de la requête.

Si votre message essaie d’atteindre l’URL suivante

mypage.php? id = 1

vous aurez les données POST mais aussi les données GET.