Comment créer une REST API avec express.js<span class="wtr-time-wrap after-title"><span class="wtr-time-number">15</span> min read</span>

Comment créer une REST API avec express.js15 min read

Aujourd’hui, nous allons voir comment créer une REST API en utilisant Node JS et le framework express.js

Sachez que c’est une technologie très utilisée dans le développement des REST API. Elle permets de manipuler facilement des bases de données et elle est très rapide.

Ici nous allons exclusivement parler de REST API. Si vous voulez apprendre à créer un site web avec des vues, vous allez devoir apprendre à charger des templates.

Ce tutoriel vous seras quand même utile mais vous allez devoir faire d’autres recherches.

C’est quoi une REST API

Je ne vais pas rentrer à fond dans les détails, j’ai un article vous expliquant tout ça.

Nous allons quand même voir les bases des REST API.

Une REST API, c’est un site web qui va permettre de manipuler une base de donnée. On peux voir ça comme une interface manipulable grâce à des liens.

Lorsque l’on envoi une requête avec une certaine url, on donne une instruction à l’application web. Elle va ensuite manipuler et renvoyer les données qui correspondent à la requête

LES REST API

Au final, on peux voir une REST API comme une interface sécurisée permettant aux clients de lire et manipuler la base de donnée.

A quoi ça sert une REST API ?

Tout tiens en un mot , décentralisation.

Une REST API va vous permettre d’avoir plusieurs clients gérés par une seule base de donnée, un seul backend.

Toutes vos données sont manipulés par votre API, et les clients ne font qu’appeler l’API.

Prenons un exemple simple, Twitter. Ils possèdent une API qui permets d’écrire et de lire des tweets. Et bien que vous soyez sur mobile ou sur PC, vous manipulez la même API.

Grâce à cela, ils n’ont pas à coder deux fois les manipulations de données. De plus, ils peuvent facilement tout centraliser sur une seule base de donnée.

Les REST API permettent une rapidité exemplaire. Il est possible de récupérer des centaines de données en quelques millisecondes. Et ce sur n’importe quelle plateforme.

Node JS et Express.js

Node JS est un langage de programmation directement basé sur Javascript.

Il utilise le système asynchrone pour pouvoir gérer beaucoup de requête en même temps. C’est donc un langage très adapté au développement web et aux REST API.

Express.js est le framework Node JS le plus utilisé. Il permets de créer rapidement une application web MVC avec un système de middleware, c’est à dire de fonctions empilés.

Ce framework est extrêmement adapté aux REST API. Il n’est pas complexe, il permets de manipuler n’importe quel système de base de donnée et supporte sans soucis la concurrence et les sessions.

Dans le monde des REST API, beaucoup des applications utilisent Node JS, et une grande majorité des applications sous Node JS utilisent express.js

C’est donc le combo le plus utilisé et c’est celui que je recommande.

Sauf qu’il nous manque quelque chose, un système de base de donnée

La base de donnée des Hipsters

Vous avez dit SQL ? Et bien non

mongo db no sql

Lorsque l’on utilise Node JS, on utilise du Javascript. Et quel est le modèle de donnée le plus utilisé au monde ? Le JSON

Et bien, pourquoi ne pas utiliser un système de base de donnée qui stocke du JSON ? Comme ça pas de transformation de donnée ?

Oui sérieusement, lorsque l’on utilise Node JS, on utilise souvent Mongo DB. C’est un système de stockage No SQL qui permets de stocker et de manipuler les données sous format JSON dans des documents.

Mongo DB est aussi rapide que Node JS et est très facilement manipulable dans Node JS grâce à une librairie appelée mongoose.

Ce que nous allons construire

Bon, c’est tout pour l’introduction.

Dans ce tutoriel, vous allez apprendre à créer une REST API gérant un blog. Vous pourrez ensuite vous amuser à créer un front end si ça vous fait plaisir.

Vous allez donc apprendre à Créer, Lire,Modifier et Supprimer des données, c’est ce que l’on appelle CRUD ou Create Read, Update , Delete.

Vous le savez peut-être, le protocole HTTP utilise des verbes pour décrire les opérations à effectuer.

Puisque nous passons par un site web (c’est tout le principe d’une REST API), nous allons utiliser les verbes pour représenter nos opérations CRUD.

Voici donc la liste des verbes HTTP que nous allons utiliser ainsi que les opérations CRUD correspondantes.

  • Lire : On utilise le verbe get , c’est celui qui est utilisé de base lorsque l’on accède à un site web. Dans la conception des REST API, on as décidé d’assigner le verbe get à l’opération de lecture car c’est l’opération la plus courrante.
  • Ecrire : Pour écrire des données, on utilise le verbe post. Par écrire, on entends créer des données. Le verbe post est initialement utilisé dans les site web pour soumettre des formulaires. Il était donc logique de l’utiliser pour la création de données.
  • Modifier : Bon, la c’est un peu complexe. Normalement, il existe deux verbes pour modifier des données, put et patch. Pour simplifier ce tutoriel, nous allons utiliser le verbe patch. Si vous voulez en apprendre plus, vous pourrez faire des recherches sur le design des REST API
  • Supprimer : Lorsque l’on veux supprimer des données, on utilise le verbe delete. Il permets simplement de supprimer définitivement un élement de la base de donnée.

ATTENTION : Les verbes HTTP présentés ci dessus ne sont absolument pas obligatoires. Ce sont des conventions utilisés dans la conceptions de REST API. Si ça vous fait plaisir vous pouvez créer des objets avec le verbe delete. Je vous recommande tout de même de suivre ces conventions car elles sont logiques , pragmatiques et elles vous permettrons de créer plus facilement vos REST API

Création de l’application

La première chose à faire, c’est installer Node JS. Je ne vais pas vous expliquer comment faire sinon ce tutoriel va faire 4000 lignes, je vous invite à chercher sur Youtube.

Une fois Node JS installé, on va vouloir installer MongoDB. Même principe, cherchez sur youtube, c’est beaucoup trop long pour être expliqué ici.

On va maintenant vouloir installer nos packages, express et mongoose.

Si jamais vous n’êtes pas à l’aise avec Node JS, je vais vous apprendre une commande permettant d’installer un package

npm install mongoose
npm install express

Ces commandes permettent d’installer nos librairies dans notre dossier node modules.

Pour ce tutoriel, nous allons vouloir créer une API manipulant des livres. Il est bien sûr possible de faire ce que vous voulez, j’ai juste trouvé l’idée sympas.

La première chose à faire, c’est de lancer notre serveur web.

Création du serveur web

Importons express dans notre fichier que nous allons appeler index.js

const express = require('express')

Cette ligne appelle une fonction intégrée à node JS. Elle va aller récupérer le package express.js et nous le renvoyer sous la forme d’un objet.

Voyons maintenant le code pour mettre en place le serveur web :

let app = express(); // création de l'objet représentant notre application express
let port = 8080;

app.get('/', function(req, res) { // création de la route sous le verbe get
    res.send('Hello world  ! ') // envoi de hello world a l'utilisateur
})


app.listen(port, () =>  { // ecoute du serveur sur le port 8080
    console.log('le serveur fonctionne')
})

Lançons notre serveur avec la commande node index.js et voyons si tout fonctionne

Bingo , on as bien notre message sur le port 8080.

Le challenge maintenant, c’est d’implémenter des routes nous permettant de manipuler la base de donnée, en l’occurrence nos livres.

La seconde étape, c’est de créer notre schema, c’est un objet type qui feras comprendre à Node JS quels objets nous allons manipuler.

Par convention, les schémas se créent dans un fichier à part, créons donc un fichier appelé livres.js

La création du schéma

Bon, vous avez l’habitude. Nous allons importer la librairie permettant de manipuler mongoDB, en l’occurence mongoose.

const mongoose = require('mongoose');

Ensuite, nous allons créer notre Schéma. Vous devez savoir que mongoose fonctionne avec un système de type. C’est à dire que chaque champ de vos objets correspond à un type.

Par exemple si vous voulez stocker le titre d’un livre, vous allez indiquer le type String à mongoose


const schema  = mongoose.Schema({
    titre : String,
    auteur : String,
    genre : String
})

Ici on manipuleras donc un objet avec 3 champs qui sont des chaînes de caractères. Pour cet exemple on fait quelque chose d’assez basique, mais sachez qu’il est possible d’utiliser n’importe quel flat type

Pour en finir avec le Schema, nous allons le transformer en model, c’est à dire un objet directement manipulable par mongoose.

module.exports = mongoose.model('livre', schema);

Nous venons d’exporter notre model, c’est à dire que nous allons pouvoir le récupérer dans le fichier index.js grâce à la fonction require

Mise en place de la REST API

Il reste une dernière étape avant de coder les routes de notre REST API, il faut d’abord se connecter à mongoDB grâce à mongoose et il faut aussi importer notre model

Voici la commande pour se connecter à la base de donnée. Ecrivez ceci juste en dessous de la ligne qui sert à importer express

const mongoose = require('mongoose')
const Livres = require('./livres') // on importe notre model

mongoose.connect('mongodb://localhost:27017/livres', {useNewUrlParser: true});

La méthode mongoose.connect prends une chaîne de caractère représentant l’url. Je ne peux pas faire un tuto complet mais sachez qu’ici on as simplement indiqué l’adresse locale de mongoDB c’est à dire le port 27017 et le nom de notre application c’est à dire livres

Si vous voulez disséquer le fonctionnement des bases de données mongoDB, vous pouvez installer le logiciel compass

Bon, maintenant que tout est mis en place, nous allons pouvoir coder nos routes.

La création des routes

La route POST

La première route que nous allons créer, c’est POST.

Dans express.js, lorsque l’on déclare une nouvelle route, on fait simplement app.verbe(route, fonction)

app.post('/', async (req, res) => {
    
})

On as donc cette route qui contiens une fonction , c’est à dire une callback. Et cette callback prends deux arguments, req et res ce qui signifie requête et réponse.

L’objet requête nous permets de manipuler tout ce que l’on va recevoir de l’utilisateur, et l’objet réponse va nous permettre de manipuler tout ce que l’on va lui envoyer.

Nous allons vouloir récupérer les données de l’objet dans le body. Néanmoins, express ne gère pas par défaut les données du body, nous allons donc devoir installer la librairie body-parser

Elle va simplement permettre à express de récupérer la valeur du body de la requête

npm install body-parser

On importe ensuite la librairie

const body = require('body-parser')

Et enfin, après la création de la variable application, on ajoute cette ligne pour utiliser le body parser

app.use(body())

L’application est maintenant capable de récupérer la valeur du body de la requête

Bon, revenons à notre route.

Nous allons maintenant voir comment créer un nouvel objet dans notre base de donnée

app.post('/', async (req, res) => {
    const titre = req.body.titre; // récupération des variables du body
    const auteur = req.body.auteur
    const genre = req.body.genre

    if (!genre || !auteur  || !titre) { // on vérifie que les trois variables sont présentes
        res.send('Il manque un argument')
        return
    }

    const nouveau_livre = new Livres({ // création d'un objet représentant notre nouveau livre
        titre : titre,
        auteur : auteur,
        genre : genre
    })
    
    await nouveau_livre.save() // sauvegarde asynchrone du nouveau livre
    res.json(nouveau_livre)
    return

})

En somme c’est un code assez simple.

Bon, testons le , pour se faire nous allons utiliser un programme qui s’appelle PostMan, il permets d’exécuter des requêtes HTTP et donc de tester notre API

Notre objet est renvoyé, tout as l’air de fonctionner.

Mais pour vraiment le savoir, nous allons implémenter les routes GET afin d’accéder à nos objets

La route GET

Enfait, on devrait dire les routes GET.

Dans une REST API, on veux une route qui nous permets d’accéder à tout les objets, et on veux une route qui nous permets d’accéder à un objet spécifique grâce à son id.

Les id sont des valeurs uniques de MongoDB. Chaque objet est identifiable et donc récupérable grâce à son id

Créons d’abord la route récupérant tout les livres. Elle utilise la fonction find sans aucun arguments, ce qui indique à mongo db que l’on veux récupérer tout les objets

app.get('/', async (req, res) => {
    const livres = await Livres.find() // On récupère tout les livres
    await res.json(livres)
})

Testons maintenant cette route

On peux voir que notre objet est bel et bien présent. J’ai volontairement crée des objets vides pour vous montrer que mongoDB ajoute par défaut une _id et une __v qui correspond à l’identifiant et à la version de l’objet

nous allons uniquement nous intéresser à l’identifiant. Puisqu’il est unique, il va nous permettre de récupérer un objet en passant un _id dans l’url

app.get('/:id', async (req, res) => {
    const id = req.params.id
})

Ici on crée une route avec un paramètre, notre id.

On récupère la valeur grâce à l’objet req.params.

Ensuite, on peux utiliser la méthode findOne de mongoose afin de récupérer l’objet unique à partir de son id

app.get('/:id', async (req, res) => {
    const id = req.params.id // on récupère la valeure dans l'url
    const livre = await Livres.findOne({_id : id}) // on récupère le livre grâce à son _id
    res.json(livre)

})

Testons maintenant cette route en essayant de récupérer uniquement un seul objet

Ici on passe l’id dans l’url et on récupère bel et bien notre objet. Vous pouvez observer que vous recevez directement un objet alors que la route précédente envoyait une liste

C’est tout pour les routes GET et POST, voyons maintenant comment implémenter les verbes delete et patch

La route delete

La route delete est très simple, elle prends l’id de l’objet à supprimer et c’est tout.

app.delete('/:id', async(req, res) => {
    const id = req.params.id
    const suppr = await Livres.deleteOne({_id : id})
    res.json(suppr)
    
})

Cette route utilise la fonction deleteOne , on lui passe l’id et le tour es joué 🙂

Le message de suppression est correct, voyons grâce à notre méthode get si l’objet existe encore

On voit que notre objet n’est plus la, la route delete fonctionne bien 🙂

La route PATCH

Finissons par la route PATCH. Recréons notre objet afin d’avoir quelque chose à modifier

Une fois fait, commençons à implémenter notre route patch

app.patch('/:id', async(req, res) => {
    const id = req.params.id
    const livre = await Livres.findOne({_id : id}) // on récupere le livre pour pouvoir le modifier
    
    // on récupère les valeurs potentiellement modifiées
    const titre = req.body.titre;
    const auteur = req.body.auteur
    const genre  = req.body.genre;
    
    // on vérifie maintenant si les valeurs sont remplies, si elles le sont on modifie l'ancienne valeure par la nouvelle
    
    if (titre) {
        livre.titre = titre
    }
    if (auteur) {
        livre.auteur = auteur
    }
    if (genre) {
        livre.genre = genre
    }
    
    await livre.save() // on sauvegarde les modifications
    
    res.json(livre)
    
    
    
})

Ici, on crée une chaine de condition qui vérifie que l’argument existe, si il existe il effectue la modification. Ensuite on sauvegarde.

Grâce à cette méthode notre route peux gérer une ou plusieurs modifications sans aucun problèmes.

Une fois la sauvegarde faite, on envoi le livre et c’est tout

testons notre route

Et ça fonctionne ! Félicitations, vous avez crée votre REST API. Vous n’avez qu’a répliquer ce processus pour chaque objet et le tour es joué 🙂

En conclusion

Créer une REST API, ce n’est pas très compliqué. Il suffit de gérer les verbes individuellement et le tour es joué

Il existe beaucoup de petites choses à connaître, comme la différence entre patch et put que nous n’avons pas abordé dans ce tuto.

J’espère que ça vous as plu, si vous avez des problèmes ou des questions, n’hésitez pas à écrire un commentaire.

Vous pouvez aussi écrire votre email pour recevoir le GUIDE ULTIME pour commencer la programmation GRATUITEMENT

Vous abonner à notre newsletter

* champ requis

Laisser un commentaire

Fermer le menu
×
×

Panier