Server fittizi dinamici e stateful

APIGit

2022-10-15

APIGit supporta server fittizi dinamici, con stato e programmabili per simulare con facilità qualsiasi logica aziendale complessa. I messaggi di richiesta HTTP vengono gestiti definendo i percorsi utilizzando mock.define() e fornendo un pattern URL, un verbo HTTP e una funzione di callback. Per esempio:

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

oppure, per un metodo POST:

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

Sono supportati metodi HTTP standard come 'DELETE', 'PUT' e 'OPTIONS'. Alla funzione di callback che fornisci vengono sempre passati due oggetti come parametri, gli oggetti Request e Response. L'oggetto Request contiene tutti i dati relativi alla richiesta in arrivo come intestazioni, payload del corpo e parametri. Usiamo l'oggetto Response per creare risposte alla richiesta.

Espandiamo l'esempio precedente e iniziamo a creare un servizio CRUD di base per gli utenti. Innanzitutto, definiamo un percorso per restituire un insieme di utenti:

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)
  })

La chiamata res.json invierà una risposta JSON all'applicazione chiamante. Ricorda di chiamare una funzione di risposta sull'oggetto res, senza di essa il tuo servizio andrà in timeout e non restituirà un risultato positivo. Esploreremo le altre funzioni di risposta disponibili in seguito

Consente di aggiungere il supporto per il filtraggio in base all'età dell'utente utilizzando i parametri di query. req.query è un oggetto contenente la stringa di query analizzata, il cui valore predefinito è {}. Se inviamo una richiesta per 'GET /users?age=30' possiamo accedere al valore dell'età con 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)
  })

Utilizziamo la funzione LoDash _.filter per estrarre un array di utenti che corrispondono all'età fornita. Se nessun utente corrisponde ai criteri di età, viene restituito un array vuoto. La libreria LoDash completa è disponibile per l'uso, fornisce funzioni utili per manipolare array e oggetti.

Per creare il nostro percorso per il recupero di un singolo utente, utilizziamo i parametri del percorso come parte del percorso URL del servizio. I parametri di route vengono specificati utilizzando la sintassi {route_param_name}, quindi nel nostro esempio il percorso URL per recuperare un utente tramite il suo nome utente sarà/users/{username}. Il req.params è un oggetto contenente proprietà mappate ai parametri di route denominati e il nostro nome utente sarà disponibile come 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 }) || {})
  })

Consente di aggiungere un percorso per la creazione di utenti. Verificheremo che sia stato inviato un nome utente con la richiesta e risponderemo con un errore 400 se mancante. I dati inviati come payload del corpo nelle richieste POST sono accessibili sull'oggetto 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" })
  })

Per impostazione predefinita, tutte le risposte restituiscono 200. Se viene fornito un numero come unico parametro per res.json, viene assegnata automaticamente una stringa del corpo della risposta. Ad esempio, 400 risponderà con "Richiesta errata". Abbiamo specificato un messaggio di errore personalizzato nell'esempio precedente.

È un buon inizio, puoi fare molto con i servizi che restituiscono semplici risposte predefinite, ma ti portano solo così lontano. Passiamo all'aggiunta di comportamenti realistici ai nostri servizi conservando i dati e generando risposte in modo dinamico.