Archives Wild Code School
Réseau

NancyFx - Créer une API REST

Quête 5 sur 6

Après cette quête, tu sauras comment coder une API REST

Objectifs

  • Programmer une API REST avec Nancy

  • Respecter les contraintes de conception

  • Utiliser la sérialisation d'objets

Nancy

Nancy est un framework léger fonctionnant sous .NET permettant de coder un serveur HTTP sans avoir à écrire toute la logique de la gestion du protocole. Son utilisation est plutôt simple et il est performant.

Réfère-toi à la documentation aussi souvent que tu en as besoin.

↗
Documentation et présentation de NancyFx

Site officiel de NancyFx

nancyfx.org

Mise en place de points d'entrée

Il est possible est très simple d'écrire une API REST avec Nancy, il suffit de déclarer des routes et roulez jeunesse !

Voici comment on peut déclarer plusieurs routes pour modifier, ajouter ou supprimer une entité:

cs
using Nancy;

namespace RESTest
{
    public class UserModule : NancyModule
    {
        public UserModule()
        {
            // Get JSON about a given user
            Get["/users/{UserId}"] = parameters => ReturnUserData(parameters.UserId);
            // Delete an existing user            
            Delete["/users/{UserId}"] = parameters => DeleteUser(parameters.UserId);
            // Add a new user
            Put["/users"] = parameters => PutNewUser();
        }

       public ReturnUserData(int userId)
       {
          // Fetch user from the database then return its attributes
          // in the JSON format
          // ...
       }

       public DeleteUser(int userId)
       {
          // Delete an users from its id
       }

       public PutNewUser()
       {
          var body = this.Request.Body;
          // Parse the JSON body to extract informations for the new user
          // that will be created
       } 
    }
 }      

Le principe du code au-dessus (et celui de NancyFx) est de relier un delegate à une route en particulier. Ainsi, la route /users/{userId} accepte deux méthodes: GET et DELETE. En appliquant le rôle des méthodes tel qu'il est défini dans le protocole HTTP, on en déduit que:

  • GET récupère les informations associées à un utilisateur (grâce à userId)

  • DELETE supprime un utilisateur (grâce à userId)

Une dernière méthode PUT sur le point d'entrée /users permet d'ajouter un utilisateur. Il faut spécifier toutes les informations nécessaires à la création d'un utilisateur dans le corps de la requête (pour suivre les contraintes d'architectures des API REST).

↗
Créer des routes avec NancyFx

Documentation officielle de NancyFx

github.com

Héberger un serveur NancyFx

Pour respecter les contraintes de conception des API REST, les communications doivent se faire en client->serveur.

Pour respecter la contrainte, on lance un serveur qui sert des ressources lors d'appels à ses URL. Il y a plusieurs manière de lancer un serveur NancyFx.

↗
Auto-hébergement d'un serveur NancyFx

Documentation officielle de NancyFx

github.com

Sérialisation

Une API REST doit pouvoir répondre sous différents formats. Un des formats que l'on retrouve le plus couramment est le format JSON.

La bibliothèque de base de C# fourni un namespace permettant de ***sérialiser ***les objets afin de les fournir sous forme de JSON (et éventuellement d'autres formats).

C'est quoi "sérialiser" ?

La sérialisation est un procédé permettant de transformer un objet stocké en mémoire vive en information utilisable par d'autres services. Ainsi, il est possible de transformer _n'importe quel _objet en JSON. La désérialisation est l'inverse (comme tu t'en doutais): il s'agit de l'action de prendre un objet sérialisé pour le transformer en instance en mémoire vive.

En C#, il existe un mécanisme de sérialisation particulier et extrêmement puissant que les ressources ci-dessous expliquent.

↗
Qu'est-ce que la sérialisation ?

Fil de discussion sur la sérialisation

stackoverflow.com
↗
Utiliser la sérialisation en C #

Documentation officielle sur la sérialisation en C #

docs.microsoft.com
↗
Sérialiser avec JSON.Net

Morceaux de code pour sérialiser/dé en JSON

newtonsoft.com

Challenge

Un système d'authentification

Tu vas écrire un système d'authentification.

Le service que tu écris peut faire partie d'un ensemble plus grand ! Il a pour but de pouvoir être greffé à d'autres services pour pouvoir construire brique par briques une application fonctionnelle utilisant l'architecture REST. Pour ce faire, il faut une séparation des responsabilités claires et sans défaut.

C'est ce que je te propose de faire en implémentant uniquement un système permettant d'ajouter, supprimer, récupérer et authentifier des utilisateurs.

Critères de validation

  • Héberge le code de ton API sur GitHub

  • Avec NancyFx, écris un serveur mettant à disposition trois routes:

    • /users/{userId}

      • GET - Récupère toutes les informations d'un objet utilisateur en JSON (sauf le mot de passe bien sûr)

      • DELETE - Supprimer un utilisateur

    • /users

      • PUT - Ajoute un nouvel utilsateur (avec un mot de passe cette fois)
    • /authentify

      • POST - Renvoie un objet JSON indiquant si l'authentification s'est bien réalisée ou non