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 :
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 :
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é :
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 !