2. Méthode POST
Après cette quête, tu comprendras l'utilité de la méthode POST et tu sauras comment en envoyer avec PostMan
Objectifs
- Comprendre l'utilisation de la méthode POST
- Utiliser la méthode POST
- Utiliser PostMan pour effectuer des requêtes POST
- Comprendre la notion de corps d'une requête
En cuisine, et que ça saute !
Le temps presse, tu es le maillon le plus important de la chaîne de restaurant : le cuisinier. Tu n'as pas le temps d'écouter les doléances de tes clients, les serveur.se.s viennent te voir et tout le monde te presse comme un citron. Chaque geste est calculé, tout est organisé pour être rapide et efficace.
Tu disposes d'un ensemble de ressources (deux kilos de tomate, un kilo de viande hachée ...), dont la quantité évolue au fur et à mesure de ta journée, selon les demandes des clients. De temps en temps, tu ne peux plus produire un plat car tu n'as pas les ingrédients nécessaires à sa réalisation. Mais tu sais rester dynamique, calculateur et rigoureux. Tu sais gérer le stress.

La méthode POST
De temps en temps, le/la serveur.se vient te demander de cuisiner un plat. Tu vas donc récupérer les ressources pour préparer ce plat. Une fois cuisinées, ces ressources ne sont plus au même niveau : celui-ci a diminué. Lorsque tu es livré en ressources, leur quantité augmente.

Un site web met à disposition des ressources, des pages, des images, de la musique, en bref, il met à disposition du contenu. Ce contenu est susceptible d'évoluer : un/une internaute peut ajouter ou retirer une de ses productions musicales sur un site comme soundcloud.com. Un/une internaute peut créer son compte sur facebook.com, le supprimer ou mettre ses informations à jour. Cela modifie les ressources dont dispose le serveur. GET n'est pas la requête utilisée pour altérer du contenu d'un site web, il s'agit de POST.
POST est énormément utilisée par ton navigateur, notamment lorsque tu soumets des informations à un site web pour créer une ressource. Les informations d'inscription d'un utilisateur sur un site ou d'une création d'article de blog sont envoyées dans le corps d'une requête POST.
POST permet d'embarquer des informations dans la requête, utilisées par le serveur pour agir sur les ressources dont il dispose. POST est aussi utilisée pour l'authentification des utilisateurs. Lorsque tu vas sur Facebook, que tu renseignes ton e-mail et ton mot de passe, ces informations sont envoyées au serveur de Facebook qui te répond - après t'avoir authentifié - et te redirige sur le fil d'actualités.
Comment puis-je passer des paramètres à la requête POST ? C'est comme avec GET ?
Les paramètres
Ton chef cuisinier te demande d'aller chercher des tomates. Tu reviens avec de belles tomates bien rouges. Le chef, furieux, te renvoie chercher à nouveau des tomates, car il les voulait vertes. Il espérait que tu aurais compris, mais ce n'était pas le cas. Il faut dire en même temps que tu ne pouvais pas le deviner. Il aurait été préférable que ton chef précise qu'il voulait des tomates vertes. Ça vous aurait évité à tous les deux de perdre votre temps, et à toi d'essuyer des postillons sur ton visage, car ton chef est un colérique incontrôlable.

Ton chef aurait dû spécifier des paramètres dans sa requête, comme tu le ferais lorsque tu te connectes sur un site web. Le site a besoin de connaître ton nom d'utilisateur. Et il le fait en analysant le corps d'une requête POST que tu lui envoies. L'utilité principale de POST est d'embarquer des informations à fournir au serveur pour modifier ses ressources. POST peut embarquer un très grand nombre d'informations, ce que ne devrait pas permettre une requête GET. On recommande à l'URL d'une requête GET d'être d'une longueur maximale de 2048 caractères, en laissant maximum 1024 caractères pour la chaîne de paramètres.
POST n'a aucune limite standard en terme de quantité d'informations qu'elle peut transmettre. De plus, les informations qu'elle transmet ne sont pas visibles dans l'URL. Premièrement pour une raison de lisibilité (imaginez tout le texte d'un article de blog embarqué dans l'URL), puis de sécurité (ça reste quand même discutable). Puisqu'on ne peut pas modifier les paramètres en modifiant directement l'URL, il y a moins de chances que l'on se fasse pirater (j'ai bien dit "chance"). Les données embarquées dans une requête POST sont stockées dans ce que l'on appelle: le corps de la requête.
De plus, il est possible de fournir différents formats de données à une requête POST. Tu peux envoyer tes données au format XML ou JSON ainsi que dans le format "cru" (raw) qui a la même syntaxe que les paramètres GET. Ainsi, POST offre une manière lisible et extensible de fournir des données au serveur.
Si j'ai bien compris, POST n'est donc pas idempotente puisqu'elle modifie des ressources sur le serveur ?
A partir de 3:26 jusqu'à 5:55
Non idempotente
Si tu répètes plusieurs fois l'action de retirer une tomate de l'ensemble des tomates dont tu disposes, il y en aura à chaque fois une de moins. Donc, ton total de tomates diminuera jusqu'à atteindre 0, et quand ton nombre de tomates sera à 0, tu ne pourras plus en retirer. "C'est logique!" penses-tu, et oui, tu as raison. Cela met en évidence le fait que l'action de retirer une tomate d'un ensemble de tomates n'est pas idempotente, puisque itérer l'action plusieurs fois change le nombre de tomates. Donc, quand le nombre de tomates atteint 0, le résultat de l'action te renvoie du vide, puisqu'il n'y a plus de tomate.
La méthode POST n'est pas plus idempotente. Réitérée à plusieurs reprises, elle peut renvoyer un résultat différent. Si tu t'inscris à un site avec une adresse e-mail, puis que tu te réinscris avec la même adresse e-mail, tu recevras un message te disant "cette adresse e-mail est déjà utilisée". Si l'on prend comme exemple une requête qui commande une pizza, itérer plusieurs fois la requête conduira à commander plusieurs fois la même pizza. Donc, la ressource renvoyée contiendra autant de pizzas que de requêtes POST. Alors la ressource ne sera jamais la même lors d'appels successifs de la même requête.
Challenge
Une grosse faim
J'ai codé un programme à ta disposition, ici. C'est un serveur qui fonctionne en local et qui te permet de composer une commande de pizzas.
A l'aide de PostMan, tu fourniras le paramètre nbPizza, qui est le nombre de pizzas à enlever ou ajouter de ta commande. Tu enverras les données de la requête au format form/raw.
L'URL à laquelle envoyer ta requête est celle-ci: http://localhost:12345/PizzaMaster.
-
Commande 10 pizzas.
-
Il y en a beaucoup trop ! Retires-en 9.
-
Un ami décide de rejoindre ta soirée pizza, tu en rajoutes donc une.
Bonne chance !
Critères de validation
- Capture vidéo de la procédure