JavaScript


REST

Raconté par Arnaud de Mesmay sur la base d'un cours créé par Rémi Forax et Vincent Jugé.

Idée

On réutilise le protocole HTTP pour faire
les appels à des services :

  • client-serveur
  • à interface uniforme
  • sans état, avec mise en cache & avec code à la demande

Interface uniforme

  • On nomme des ressources en utilisant des URIs.
  • On utilise des méthodes HTTP comme action :
    GET, PUT, POST, DELETE.
  • La façon dont sont stockées les données est indépendante de la représentation !
  • On utilise XML et/ou JSON comme format de transport.

Exemple

On va utiliser une addresse de base api.foo.bar.com.
On souhaite utiliser l'URI users pour accéder aux utilisateurs. Pour créer, lister, mettre à jour ou supprimer des utilisateurs, on utilisera donc l'adresse http://api.foo.bar.com/users.

Utilisation des actions

GET PUT POST DELETE
/users/ liste les utilisateurs remplace les utilisateurs crée un nouvel utilisateur détruit les utilisateurs
/users/bob récupère les propriétés d'un utilisateur met à jour un utilisateur supprime un utilisateur

REST côté serveur

Exemple avec express.js

express.js est une bibliothèque qui permet de créer des points d'entrée (endpoint) REST en JavaScript.
Elle utilise le « serveur » node.js.

Exemple avec express.js

         
const express = require('express');
const app = express();

app.get('/users', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);

On crée un endpoint sur l'URI /users puis on écoute les clients sur le port TCP 3000 en leur répondant Hello World!.

Créer un endpoint

on utilise les verbes get, post, put, delete (en minuscules).

         
app.post('/users', (req, res) => {
  ...
});
         
app.put('/users', (req, res) => {
  ...
});
         
app.delete('/users', (req, res) => {
  ...
});

Extraire des paramètres de l'URI

La propriété params de l'objet requête permet d'obtenir les paramètres nommés extraits de l'URI.

         
app.get('/users/:id', (req, res) => {
  console.log('user id ' + req.params.id);
});

Les paramètres nommés commencent par ':' dans l'URI.

Récupérer les cookies dans la requête

Les cookies sont stockés par le client et envoyés à chaque requête.

         
app.get('/users/:id', (req, res) => {
  console.log(req.cookies);
});

cookies contient tous les cookies valides pour l'URI.
cookies est un dictionnaire dont les clés sont les noms des cookies.

Code de la réponse

status permet d'indiquer le code HTTP de la réponse.

         
app.get('/users/:id', (req, res) => {
  res.status(404).send('Oops');
});

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

Envoyer une réponse (texte)

send permet d'envoyer une réponse textuelle.

         
app.get('/users/:id', (req, res) => {
  res.send('OK !');
});

Le Content-Length est la longeur de la chaine de caractères.
Si le status n'est pas positionné, la valeur est 200.

Envoyer une réponse (fichier)

sendFile permet d'envoyer un fichier en réponse.

         
app.get('/users/:id', (req, res) => {
  res.sendFile('/absolute/path/to/ok.png');
});

Le Content-Type dépend de l'extension.
Le Content-Length est la taille du fichier.

Envoyer une réponse (JSON)

json permet d'envoyer une réponse au format JSON.

         
app.get('/users/:id', (req, res) => {
  let id = req.params.id;
  res.json('{ user: ' + id + ' }');
});

Le Content-Type est application/json.

Envoyer des entêtes de réponse

Sur l'objet réponse, set et append permettent d'ajouter des entêtes de réponse.

         
app.get('/users/:id', (req, res) => {
  res.set('Set-Cookie', 'foo=bar; Path=/; HttpOnly');
});

HttpOnly veut dire pas dans les requêtes AJAX !

Content-Type

type permet d'indiquer le Content-Type.

         
app.get('/users/:id', (req, res) => {
  res.type('text/html').send('
    <html>
      <body>
        Ok
      </body>
    </html>
  ');
});