Serveurs fictifs dynamiques et avec état

APIGit

2022-10-15

APIGit prend en charge les serveurs fictifs dynamiques, avec état et programmables pour simuler facilement n'importe quelle logique métier complexe. Les messages de requête HTTP sont gérés en définissant des itinéraires à l'aide de mock.define() et en fournissant un modèle d'URL, un verbe HTTP et une fonction de rappel. Par example:

mock.define('/users', 'GET', function(req, res) {
    ...
  })

ou, pour une méthode POST :

mock.define('/users', 'POST', function(req, res) {
    ...
  })

Les méthodes HTTP standard telles que les méthodes 'DELETE', 'PUT' et 'OPTIONS' sont prises en charge. La fonction de rappel que vous fournissez reçoit toujours deux objets en tant que paramètres, les objets Request et Response. L'objet Request contient toutes les données relatives à la demande entrante telles que les en-têtes, la charge utile du corps et les paramètres. Nous utilisons l'objet Response pour construire des réponses à la requête.

Développons l'exemple ci-dessus et commençons à créer un service CRUD de base pour les utilisateurs. Tout d'abord, définissons une route pour renvoyer un ensemble d'utilisateurs :

mock.define('/users', 'GET', function(req, res) {
    var users = [ 
      { username: "dave", email: "dave@gmail.com" },
      { username: "john", email: "john@gmail.com" }
    ]
  
    return res.json(users)
  })

L'appel res.json enverra une réponse JSON à l'application appelante. N'oubliez pas d'appeler une fonction de réponse sur l'objet res, sans elle, votre service expirera et ne renverra pas de résultat positif. Nous explorerons les autres fonctions de réponse disponibles plus tard

Ajoutons la prise en charge du filtrage en fonction de l'âge de l'utilisateur à l'aide de paramètres de requête. req.query est un objet contenant la chaîne de requête analysée, par défaut {}. Si nous soumettons une demande pour 'GET /users?age=30', nous pouvons accéder à la valeur d'âge avec req.query.age :

mock.define('/users', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    if (req.query.age) {
      // convert req.query.age from String to a Number before filtering
      return res.json(_.filter(users, { 'age': Number(req.query.age) }))
    }
  
    return res.json(users)
  })

Nous utilisons la fonction LoDash _.filter pour extraire un tableau d'utilisateurs correspondant à l'âge fourni. Si aucun utilisateur ne correspond aux critères d'âge, un tableau vide est renvoyé. La bibliothèque LoDash complète est disponible, elle fournit des fonctions utiles pour manipuler des tableaux et des objets.

Pour créer notre route pour récupérer un seul utilisateur, nous utilisons des paramètres de route dans le cadre du chemin d'URL du service. Les paramètres de route sont spécifiés à l'aide de la syntaxe {route_param_name}, donc dans notre exemple, le chemin d'URL pour récupérer un utilisateur par son nom d'utilisateur sera/users/{username}. Le req.params est un objet contenant des propriétés mappées aux paramètres de route nommés et notre nom d'utilisateur sera disponible en tant que req.params.username.

mock.define('/users/{username}', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    // respond with the user or an empty object if user doesnt exist
    return res.json(_.find(users, { 'username': req.params.username }) || {})
  })

Ajoutons une route pour créer des utilisateurs. Nous vérifierons qu'un nom d'utilisateur a été envoyé avec la demande et répondrons avec une erreur 400 s'il est manquant. Les données envoyées en tant que charge utile de corps dans les requêtes POST sont accessibles sur l'objet req.body.

mock.define('/users', 'POST', function(req, res) {
    // validate username is present
    if (req.body.username === undefined) {
      return res.json(400, { error: { message: "Missing username" } })
    }
  
    return res.json({ status: "ok" })
  })

Par défaut, toutes les réponses renvoient un 200. Si un nombre est fourni comme seul paramètre à res.json, une chaîne de corps de réponse vous est attribuée. Par exemple, 400 répondra par "Bad Request". Nous avons spécifié un message d'erreur personnalisé dans l'exemple ci-dessus.

C'est un bon début, vous pouvez faire beaucoup avec des services qui renvoient des réponses simples, mais ils ne vous mènent que très loin. Passons à l'ajout d'un comportement réaliste à nos services en conservant les données et en générant dynamiquement des réponses.