Gestion des données côté serveur

Faire une API avec son serveur.

Gérer des données côté serveur nécessite plusieurs actions bien distinctes :

  1. organisation des requêtes possible sous la forme d'une API
  2. manipulation d'une donnée : CRUD
  3. transfert et stockage : sérialisation

API

L'échange de données entre le client et le serveur se fait grâce à une API qui détermine les routes utilisables (en utilisant des routes paramétrables). Il existe plusieurs moyens d'organiser une API :

CRUD

Cet acronyme signifie :

Et rappelle le cycle de vie d'une donnée. Il faut que l'API puisse permettre au client d'effectuer ces actions CRUD pour chacune des données (si possible). On a coutume d'expliciter ces requêtes en utilisant des méthodes HTTP différentes :

On ne peut via un navigateur qu'utiliser des méthode get. Pour utiliser les autres méthodes, on peut utiliser fetch en javascript en spécifiant la méthode à utiliser

Pour tester les méthodes lorsque l'on est entrain de développer, on a coutume d'utiliser une application tierce, comme https://www.postman.com/ par exemple (on peut l'utiliser de façon gratuite sans avoir besoin de s'inscrire)

Souvent, on n'a besoin que des méthodes GET (pour lire) et POST (pour écrire et mettre à jour) la donnée. Par exemple, supposons que l'on veuille stocker une unique donnée. On veut pouvoir :

On peut utiliser le code express suivant :

import express from 'express'

const app = express()

const hostname = '127.0.0.1';
const port = 3000;

let donnée = 42

app.get('/', (req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/json; charset=utf-8');

    res.end(donnée.toString());

})


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

    donnée = req.query.valeur;
    res.redirect('/');

})


app.listen(port, hostname);
console.log(`Server running at http://${hostname}:${port}/`);

Plusieurs remarques :

Il nous est impossible de tester des requêtes POST directement avec le navigateur, nous les utiliserons via des requêtes fetch en javascript plus tard. Pour l'instant testons notre serveur avec postman.

  1. créez le projet serveur. N'oubliez pas de faire un npm init et d'ajouter la ligne "type": "module", à votre fichier package.json comme on l'a vu en cours.
  2. Utilisez https://www.postman.com/ pour tester la route / en GET

corrigé

Pour le projet n'oubliez pas d'ajouter le module express et de préciser à node que l'on utilise des modules ES6.

Ensuite la requête postman doit donner :

postman-GET

On voit bien que le retour (le body de la requête) est 42.

Une fois l'exercice précédent réussi, on peut tenter la requête POST :

  1. Utilisez https://www.postman.com/ pour tester la route /&valeur=12 en POST
  2. demandez la route / en GET. Est-ce cohérent ?

corrigé

La requête POST modifie une valeur dans le serveur :

postman-POST

En refaisant une requête GET ensuite, on voit bien que la valeur a été modifiée côté serveur.

postman-GET-after-POST

On vérifie que l'on a bien compris tout ce qu'il s'est passé :

  1. Utilisez https://www.postman.com/ pour tester la route /&valeur=12 en GET. Que se passe-t-il ?
  2. Pourquoi la requête /&valeur=12 en POST rend-elle un résultat dans le body ?

corrigé

La seule route GET de notre serveur est /. C'est cette route qui a été choisie :

postman-GET-avec-paramètres

La requête POST rend quelque chose dans le body car postman suit directement les redirect. C'est la réponse du redirect ue l'on observe. On peut le vérifier en supprimant le redirect automatique :

postman-redirect-settings

et en recommençant la requête :

postman-POST-no-redirect

JSON pour sérialiser ses données

La sérialisation/désérialisation est l'opération consistant à transformer une donnée en un format facilement transportable/stockable et à procéder à l'opération inverse pour retrouver la donnée originelle.

Cette opération est cruciale dans toute gestion des données. Pour le web :

  • les données : des dictionnaires javascript
  • le format facilement transportable : le texte (utf8).

La façon de convertir les dictionnaires en texte et réciproquement est régie par le json

Le json est tellement bien fait qu'il est utilisé partout ! Il est en effet très facile à lire, à modifier avec un simple éditeur de texte, et à transférer avec une simple requête http.

Le code suivant est la version json du serveur précédent :

import express from 'express'

const app = express()

const hostname = '127.0.0.1';
const port = 3000;

let donnée = {
    valeur: 42
}

app.use(express.json())

app.get('/', (req, res) => {
    res.json(donnée);

})


app.post('/', (req, res) => {
    // console.log(req.body)

    donnée.valeur = req.body.valeur;
    res.redirect('/');

})


app.listen(port, hostname);
console.log(`Server running at http://${hostname}:${port}/`);

On utilise un middleware express express.json() qui ajoute un attribut body à la requête contenant ce que auà envoyé le client.

Vous verrez des tutoriels qui vous font installer body-parser, ils sont obsolètes. Depuis express 4.16, on peut utiliser express directement.

Lorsque l'on veut envoyer directement on place directement le json dans le corps du message (body) que l'on envoie :

postman-json

Attention dans postman à bien choisir raw comme format d'envoie et à choisir json comme format raw.