4. Effectuer une requête POST avec Insomnia

Maintenant que l’on sait se servir d’Insomnia pour envoyer des requêtes sur notre API Rest, nous allons enfin pouvoir tester notre endpoint d’ajout d’un pokémon, depuis le temps !

Créons donc une nouvelle requête comme précédemment, à la différence que cette fois-ci :

  • Le nom est différent, afin de mieux organiser nos requêtes dans Insomnia.
  • Le type de la requête devient POST, et non GET.
  • Nous devons ajouter l’option supplémentaire JSON, afin d’indiquer le format des données que nous allons envoyer depuis Insomnia. Bien sûr, nous restons fidèles au format JSON.
On crée notre requête POST depuis Insomnia.

Ensuite, nous allons avoir besoin des données d’un nouveau pokémon à ajouter à notre API Rest, au format JSON. Je vous propose le pokémon Chenipan, qui ressemble à un petit asticot. À prendre ou à laisser 😉 :

{
  "name": "Chenipan",
  "hp": 29,
  "cp":4,
  "picture": "https://assets.pokemon.com/assets/cms2/img/pokedex/detail/010.png",
  "types": ["Insecte", "Poison"]
 }

Voici donc les données du nouveau pokémon Chenipan que nous voulons ajouter à notre backend.

Remarquez que par rapport à un pokémon complet, nous n’envoyons pas les propriétés id et created du pokémon. En effet, c’est au rôle de notre backend d’attribuer un identifiant unique, pas à Insomnia.

Quant à la propriété created, nous ne pouvons pas attribuer de valeur dynamique depuis un fichier JSON. Là encore, c’est généralement le serveur qui se charge de gérer la date de création d’une nouvelle ressource. C’est plus logique quand on y réfléchit, car les clients peuvent avoir des horloges internes différentes, alors que le serveur est capable d’uniformiser les dates entre toutes les données de votre application.

Je vous invite donc à copier-coller les informations ci-dessus, et les passer dans Insomnia. Plus précisément dans le corps de la requête :

On définit un corps pour notre requête POST, au format JSON bien sûr !

Puis on ajoute également l’URL http://localhost:3000/pokemons pour cette requête, juste au-dessus.

Ensuite, et bien prenez votre courage à deux mains, et envoyer cette requête vers votre API Rest !

Après un très léger délai, un message de réponse s’affiche enfin dans Insomnia. Voici ce que j’obtiens de mon côté :

Notre première requête POST provoque une erreur étrange dans notre API Rest.

Cette erreur est très étrange !

C’est même pas du tout ce qu’on veut. Notre API Rest nous indique que le pokémon se nomme undefined, alors que nous avons bien envoyé le nom Chenipan dans le corps de la requête.

D’ailleurs, il semble qu’aucune donné ne soit réellement récupéré par l’API Rest, puisque dans le champ data à la ligne 3, on ne voit s’afficher que l’identifiant d’un pokémon. Mais nous déterminons l’identifiant unique d’un pokémon en interne, et ce n’est pas lié avec le corps de la requête que nous avons envoyé…

Afin de comprendre quelle est la cause de l’erreur, reprenons notre code précédent et analysons le déroulement de ce qu’il s’est passé, ligne par ligne :

app.post('/api/pokemons', (req, res) => {
  const id = getUniqueId(pokemons)
  // Problème ci-dessous, le body est une string et non un JSON !
  const pokemonCreated = { ...req.body, ...{id: id, created: new Date()}}
  pokemons.push(pokemonCreated)
  const message = `Le pokémon ${pokemonCreated.name} a bien été crée.`
  res.json(success(message, pokemonCreated))
})

En fait, c’est lié au fonctionnement d’une API Rest et du format JSON. À la ligne 3, nous récupérons non pas le JSON envoyé par Insomnia, mais simplement une chaîne de caractère. En fait, quand les données transites via le protocole HTTP, elles ne peuvent l’être que sous la forme d’une chaîne de caractère.

En soit cela ne pose pas problème, car il est très simple de transformer un JSON en une chaîne de caractères, et inversement. Dans le fond, ce sont simplement des données textuelles…

Par contre, à l’atterrissage dans notre API Rest, c’est plutôt gênant. On voudrait transformer les données sous forme de chaînes de caractères en JSON, et cela pour chaque requête entrante…

On dirait que l’on va devoir utiliser les Middlewares non ? 😉

Si vous avez l’impression d’avoir tout fait “sauter » et que vous voulez repartir sur une base seine, relancer simplement la commande npm start !