HTTPQUERY
Français

POST

Utilisation

Une requête POST soumet une entité à la ressource indiquée. Le serveur détermine comment traiter la représentation incluse en fonction de la sémantique propre à la ressource. Contrairement à PUT, qui cible un URI de ressource précis, POST délègue le traitement à la ressource identifiée par l’URI cible.

L’en-tête Content-Type indique le format du corps de la requête. Trois encodages sont courants dans les formulaires HTML et les API.

application/x-www-form-urlencoded

L’encodage par défaut des formulaires HTML. Les données sont structurées en paires clé-valeur séparées par des esperluettes (&), les clés et les valeurs étant reliées par des signes égal (=). Les caractères non alphanumériques utilisent le Percent-Encoding.

name=Alice&role=admin

multipart/form-data

Chaque champ occupe une partie distincte délimitée par une chaîne de séparation déclarée dans l’en-tête Content-Type. Cet encodage prend en charge les données binaires, comme les envois de fichiers. L’en-tête Content-Disposition présent dans chaque partie nomme le champ.

text/plain

Aucune structure imposée. Le serveur traite le corps brut selon sa propre logique.

Les requêtes POST répétées ne sont pas idempotentes. Soumettre deux fois le même formulaire crée deux ressources ou déclenche deux fois le traitement, contrairement à PUT où une requête répétée produit le même état serveur.

Les réponses POST ne sont mises en cache que lorsque la réponse inclut des informations de fraîcheur explicites et un en-tête Content-Location correspondant.

Soumission de formulaire

Un client soumet des données de formulaire au format URL-encoded. Le serveur crée une tâche et répond avec 201 Created.

Requête

POST /jobs HTTP/1.1
Host: api.example.re
Content-Type: application/x-www-form-urlencoded
Content-Length: 17

name=backup&pri=2

Réponse

HTTP/1.1 201 Created
Location: /jobs/47
Content-Type: application/json
Content-Length: 38

{"id":47,"name":"backup","priority":2}

Envoi de fichier multipart

Un client envoie un fichier en utilisant l’encodage multipart. La chaîne de séparation ----Boundary sépare chaque partie. Le serveur accepte l’envoi et renvoie 202 Accepted.

Requête

POST /uploads HTTP/1.1
Host: api.example.re
Content-Type: multipart/form-data; boundary=----Boundary
Content-Length: 196

------Boundary
Content-Disposition: form-data; name="title"

Q4 Report
------Boundary
Content-Disposition: form-data; name="file"; filename="report.pdf"
Content-Type: application/pdf

<binary data>
------Boundary--

Réponse

HTTP/1.1 202 Accepted
Location: /uploads/91
Content-Length: 0

JSON API

Un client envoie une charge utile JSON pour créer un nouvel utilisateur. Le serveur renvoie la ressource créée avec un champ id.

Requête

POST /users HTTP/1.1
Host: api.example.re
Content-Type: application/json
Content-Length: 41

{"email":"alice@example.re","role":"ops"}

Réponse

HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 50

{"id":112,"email":"alice@example.re","role":"ops"}

CORS

POST est une méthode figurant sur la liste sûre de CORS, mais uniquement lorsque le Content-Type est application/x-www-form-urlencoded, multipart/form-data ou text/plain. Un POST avec application/json ou tout autre type de contenu déclenche une requête préliminaire OPTIONS.

POST comparé à GET

POST transporte les données dans le corps de la requête plutôt que dans l’URL. Cela maintient les paramètres hors de l’historique du navigateur, des journaux serveur et des en-têtes Referer, ce qui rend POST mieux adapté aux données sensibles.

Les réponses POST ne sont pas mises en cache par défaut et ne peuvent pas être mises en favori. POST n’est ni sûre ni idempotente, si bien que des soumissions répétées créent des ressources en double ou déclenchent plusieurs fois le traitement.

POST n’a pas de limite pratique de taille de corps, alors que GET est contrainte par des limites de longueur d’URL situées autour de 2048 caractères.

Les cookies avec SameSite=Lax bloquent les requêtes POST intersites mais autorisent les GET intersites. Cela confère à POST un certain niveau de protection CSRF intégrée que GET n’a pas.

Sécurité

Les données POST n’apparaissent pas dans les URL, l’historique du navigateur ni les en-têtes Referer. Cela réduit le risque d’exposition accidentelle de données par rapport à GET.

POST reste vulnérable aux attaques CSRF en l’absence de jetons appropriés. Les formulaires présents sur des pages malveillantes soumettent automatiquement des requêtes POST vers d’autres origines. Les cookies SameSite=Lax offrent une protection partielle en bloquant la transmission de cookies sur les POST intersites, mais des jetons CSRF dédiés restent nécessaires.

Un POST en HTTP simple transmet les données en clair. HTTPS est indispensable pour protéger le corps de la requête pendant son transit.

POST comparé à PATCH

POST crée de nouvelles ressources à des URI choisis par le serveur. PATCH modifie des ressources existantes à des URI connus.

POST délègue entièrement la sémantique de traitement au serveur. PATCH dispose de formats de patch définis, tels que JSON Patch et JSON Merge Patch, qui décrivent les modifications précises à appliquer.

Lorsqu’un client doit mettre à jour des champs précis d’une ressource existante, PATCH est la méthode appropriée. POST sert à créer de nouvelles ressources ou à déclencher un traitement côté serveur.