Dans une requête HTTP GET , les paramètres sont envoyés sous forme de chaîne de requête :
http://example.com/page ? parameter = value & also = another
Dans une demande HTTP POST , les paramètres ne sont pas envoyés avec l'URI.
Où sont les valeurs? Dans l'en-tête de demande? Dans l'organe de requête? À quoi cela ressemble-t-il?
multipart/form-data
. Pour ceux qui sont intéressés, voici une question à ce sujet .multipart/form-data
ou si vous êtes en charge de la construction de la demande, changer le type de contenuapplication/json
et coller le texte json directement dans le corps httpLe contenu est placé après les en-têtes HTTP. Le format d'un HTTP POST est d'avoir les en-têtes HTTP, suivis d'une ligne vierge, suivis du corps de la requête. Les variables POST sont stockées sous forme de paires clé-valeur dans le corps.
Vous pouvez le voir dans le contenu brut d'une publication HTTP, illustré ci-dessous:
Vous pouvez le voir en utilisant un outil comme Fiddler , que vous pouvez utiliser pour regarder les charges utiles brutes de demande et de réponse HTTP envoyées sur le câble.
la source
application/x-www-form-urlencoded
, ce qui n'est pas toujours le cas.From
tête là-bas?From
tête. OMI, il est là-haut avec le code d'état HTTP 418.Réponse courte: dans les requêtes POST, les valeurs sont envoyées dans le "corps" de la requête. Avec les formulaires Web, ils sont très probablement envoyés avec un type de support
application/x-www-form-urlencoded
oumultipart/form-data
. Les langages de programmation ou des cadres qui ont été conçus pour gérer les requêtes web ne sont généralement « The Right Thing ™ » avec ces demandes et vous fournir un accès facile aux valeurs facilement décodés (comme$_REQUEST
ou$_POST
en PHP, oucgi.FieldStorage()
,flask.request.form
en Python).Maintenant, nous allons nous éloigner un peu, ce qui peut aider à comprendre la différence;)
La différence entre
GET
et lesPOST
demandes sont largement sémantiques. Ils sont également «utilisés» différemment, ce qui explique la différence dans la façon dont les valeurs sont transmises.GET ( section RFC pertinente )
Lors de l'exécution d'une
GET
demande, vous en demandez une au serveur ou un ensemble d'entités. Pour permettre au client de filtrer le résultat, il peut utiliser la "chaîne de requête" de l'URL. La chaîne de requête est la partie après le?
. Cela fait partie de la syntaxe URI .Ainsi, du point de vue de votre code d'application (la partie qui reçoit la demande), vous devrez inspecter la partie de requête URI pour accéder à ces valeurs.
Notez que les clés et les valeurs font partie de l'URI. Les navigateurs peuvent imposer une limite à la longueur de l'URI. La norme HTTP indique qu'il n'y a pas de limite. Mais au moment où nous écrivons ces lignes, la plupart des navigateurs ne limitent les URIs (je n'ai pas de valeurs spécifiques).
GET
les demandes ne doivent jamais être utilisées pour soumettre de nouvelles informations au serveur. Surtout pas des documents plus volumineux. C'est là que vous devez utiliserPOST
ouPUT
.POST ( section RFC pertinente )
Lors de l'exécution d'une
POST
demande, le client soumet en fait un nouveau document à l'hôte distant. Ainsi, une chaîne de requête n'a pas (sémantiquement) de sens. C'est pourquoi vous n'y avez pas accès dans votre code d'application.POST
est un peu plus complexe (et beaucoup plus flexible):Lors de la réception d'une demande POST, vous devez toujours vous attendre à une "charge utile" ou, en termes HTTP: un corps de message . Le corps du message en lui-même est assez inutile, car il n'y a pas de format standard (pour autant que je sache. Peut-être application / octet-stream?). Le format du corps est défini par l'en-
Content-Type
tête. Lorsque vous utilisez unFORM
élément HTML avecmethod="POST"
, c'est généralement le casapplication/x-www-form-urlencoded
. Un autre type très courant est le multipart / form-data si vous utilisez des téléchargements de fichiers. Mais cela pourrait être n'importe quoi , allant detext/plain
, au-dessusapplication/json
ou même une coutumeapplication/octet-stream
.Dans tous les cas, si une
POST
demande est faite avec unContent-Type
qui ne peut pas être traité par l'application, elle doit renvoyer un415
code d'état .La plupart des langages de programmation (et / ou cadres Web) offrent un moyen de dé / coder le corps du message de / vers les types les plus courants (comme
application/x-www-form-urlencoded
,multipart/form-data
ouapplication/json
). C'est donc simple. Les types personnalisés nécessitent potentiellement un peu plus de travail.En utilisant un document codé de formulaire HTML standard comme exemple, l'application doit effectuer les étapes suivantes:
Content-Type
terrain415
code d'étatEncore une fois, des langages comme PHP ou des frameworks Web pour d'autres langages populaires s'en occuperont probablement pour vous. L'exception à cela est l'
415
erreur. Aucun cadre ne peut prédire les types de contenu que votre application choisit de prendre en charge et / ou de ne pas prendre en charge. C'est à toi de décider.PUT ( section RFC pertinente )
Une
PUT
demande est à peu près traitée de la même manière qu'unePOST
demande. La grande différence est qu'unePOST
demande est censée laisser le serveur décider comment (et le cas échéant) créer une nouvelle ressource. Historiquement (à partir de la RFC2616 désormais obsolète, il s'agissait de créer une nouvelle ressource en tant que "subordonné" (enfant) de l'URI où la demande a été envoyée).Une
PUT
demande en revanche est censée «déposer» une ressource exactement à cet URI, et avec exactement ce contenu. Ni plus ni moins. L'idée est que le client est responsable de créer la ressource complète avant de la "METTRE". Le serveur doit l'accepter tel quel sur l'URL donnée.Par conséquent, une
POST
demande n'est généralement pas utilisée pour remplacer une ressource existante. UnePUT
demande peut à la fois créer et remplacer.Side-Note
Il existe également des " paramètres de chemin " qui peuvent être utilisés pour envoyer des données supplémentaires à la télécommande, mais ils sont si rares que je n'entrerai pas dans trop de détails ici. Mais, pour référence, voici un extrait du RFC:
la source
PUT
section, vous verrez qu'il est idempotent.POST
en revanche ne peut pas - par définition - être.POST
créera toujours une nouvelle ressource.PUT
sera, s'il existe une ressource identique, la remplacer. Donc, si vous appelezPOST
10 fois, vous créerez 10 ressources. Si vous appelezPUT
10 fois, il n'en créera (peut-être) qu'un. Est-ce que ça répond à votre question?Vous ne pouvez pas le saisir directement dans la barre d'URL du navigateur.
Vous pouvez voir comment les données POST sont envoyées sur Internet avec des en-têtes HTTP en direct, par exemple. Le résultat sera quelque chose comme ça
Où il est dit
seront les valeurs de publication.
la source
Content-Length
censé être29
ici? C'est la longueur réelle de la chaîneusername=zurfyx&pass=password
.Le type de support par défaut dans une demande POST est
application/x-www-form-urlencoded
. Il s'agit d'un format de codage des paires clé-valeur. Les clés peuvent être dupliquées. Chaque paire clé-valeur est séparée par un&
caractère, et chaque clé est séparée de sa valeur par un=
caractère.Par exemple:
Est codé comme:
Ceci est placé dans le corps de la demande après les en-têtes HTTP.
la source
Les valeurs de formulaire dans HTTP POST sont envoyées dans le corps de la demande, au même format que la chaîne de requête.
Pour plus d'informations, voir la spécification .
la source
?
exemple?application/x-www-form-urlencoded
, ce qui n'est pas toujours le cas.Certains services Web nécessitent que vous placiez les données de demande et les métadonnées séparément. Par exemple, une fonction distante peut s'attendre à ce que la chaîne de métadonnées signée soit incluse dans un URI, tandis que les données sont publiées dans un corps HTTP.
La requête POST peut ressembler sémantiquement à ceci:
Cette approche combine logiquement QueryString et Body-Post en utilisant un seul
Content-Type
qui est une "instruction d'analyse" pour un serveur Web.Remarque: HTTP / 1.1 est entouré de
#32
(espace) à gauche et de#10
(Saut de ligne) à droite.la source
/user/john
et/?user=john
est simplement sémantique (HTTP ne donne pas vraiment de traitement spécial aux chaînes de requête), donc je considère cela comme raisonnablement attendu. Mais que voulez-vous dire par «enveloppé par un espace à gauche»? Il n'y a pas d'espaces avant la méthode HTTP. Vous voulez dire la ligne vierge pour le corps du message?...Ym04
etHTTP/1.1
dans le code ci-dessus. Un QueryString réside donc simplement entre le verbe et la version du protocole.?
comme nous le faisons avec lesGET
demandes.Tout d'abord, faisons la différence entre
GET
etPOST
Get: il s'agit de la
HTTP
demande par défaut adressée au serveur et utilisée pour récupérer les données du serveur et la chaîne de requête qui suit?
dans aURI
est utilisée pour récupérer une ressource unique.c'est le format
voici
data=value
la valeur de la chaîne de requête passée.POST: Il est utilisé pour envoyer des données au serveur en toute sécurité, donc tout ce qui est nécessaire, c'est le format d'une
POST
demandePourquoi POST sur GET?
Dans
GET
la valeur envoyée aux serveurs sont généralement ajoutés à l'URL de base dans la chaîne de requête, il y a maintenant 2 conséquences de celaGET
demandes sont enregistrées dans l'historique du navigateur avec les paramètres. Vos mots de passe restent donc non chiffrés dans l'historique du navigateur. C'était un vrai problème pour Facebook à l'époque.URI
. Si vous avez envoyé trop de paramètres, vous pourriez recevoir414 Error - URI too long
En cas de demande de publication, vos données des champs sont ajoutées au corps à la place. La longueur des paramètres de demande est calculée et ajoutée à l'en-tête pour la longueur du contenu et aucune donnée importante n'est directement ajoutée à l'URL.
Vous pouvez utiliser la section réseau des outils pour les développeurs Google pour afficher des informations de base sur la façon dont les demandes sont envoyées aux serveurs.
et vous pouvez toujours ajouter plus de valeurs dans votre
Request Headers
commeCache-Control
,Origin
,Accept
.la source
HTTPS
connexion, nonHTTP
.HTTPS
crypte à la fois leURL
(y compris les paramètres de requête) et leRequest Body
, quand neHTTP
crypte / protège ni l'un ni l'autre. Le problème décrit provient du fait que de nombreux navigateurs stockent leURIs
(y comprisURLs
) dans leurs bases de données d'historique (généralement non cryptées). Donc, n'utilisez que leRequest Body
+HTTPS
pour tout ce qui est sensible.