In un articolo precedente, abbiamo introdotto Node.js, un ambiente di esecuzione che permette di realizzare applicazioni in Javascript non destinate al browser.
Proseguiamo il nostro viaggio in questa piattaforma imparando a predisporre delle API raggiungibili mediante invocazioni REST.
Oltre a Node.js, che supporremo già installato e funzionante, avremo bisogno di un suo modulo, Express.js, che offre un’evoluta infrastruttura di rete.
Installiamo Express
Installeremo Express tramite npm, come è prassi nell’ambiente di Node.js, quindi tutte le operazioni saranno svolte da riga di comando, indipendentemente dal sistema operativo che stiamo usando.
Per prima cosa, creiamo una cartella – nell’esempio la chiameremo myapp – e ci spostiamo al suo interno:
> npm init
questo comando produce il file package.json che in Node.js è al centro della configurazione dell’applicazione. Per produrlo ci verranno chieste alcune informazioni tra cui l’entry point ossia il nome del file Javascript che rappresenta l’avvio dell’applicazione: noi sceglieremo di chiamarlo app.js.
A questo punto potremo installare express:
> npm install express --save
Prepariamo l’esempio
Nell’esempio, gestiremo un elenco di persone – in realtà, rappresentati da un insieme di dati casuali – che vorremo rendere accessibile tramite API.
Supporremo che l’utente conosca già il pattern REST ma, tanto per fare un breve richiamo, ne riepilogheremo qui il concetto.
Il protocollo HTTP è il mezzo con cui vengono normalmente trasmesse le pagine Internet ed offre alcuni “metodi” che permettono di specificare quale azione vogliamo intraprendere sui dati gestiti dal server. Dei vari metodi esistenti, quattro in particolare simboleggiano le azioni principali che possono essere svolti nella modifica di un dataset: GET per la lettura, POST per la modifica, PUT per la creazione e DELETE per la cancellazione.
Con Node.js ed Express insieme offriremo ai nostri oggetti Javascript un’interfaccia sulla Rete le cui funzionalità potranno essere invocate specificando un URL ed un metodo HTTP.
I dati – almeno per questa lezione – non saranno custoditi in un database bensì in un array di oggetti che rimarrà “vivo” finchè il nostro server basato su Node.js sarà in esecuzione.
Secondo lo stile REST definiremo alcuni percorsi del server che saranno raggiungibili mediante metodi HTTP:
- il metodo GET permetterà di richiedere l’elenco delle persone all’indirizzo /elenco/tutti;
- il metodo POST permetterà di creare con dati casuali un certo numero di oggetti nell’elenco con la chiamata /elenco/crea/ concatenato con il numero di oggetti da produrre: ad esempio, invocando l’indirizzo /elenco/crea/20 saranno generate le informazioni di 20 persone.
Express.js sarà approfondito nei prossimi tutorial, in questa lezione ci preoccuperemo, per lo più, di usarlo nel modo più diretto possibile.
Le fasi che dovremo seguire saranno:
- integrazione del modulo tramite metodo require: subito dopo istanzieremo un oggetto che rappresenta il framework Express;
- definizione delle varie chiamate inoltrabili: l’oggetto express offrirà un metodo per ogni tipo di accesso (get, post, etc.) i quali riceveranno in input due parametri, uno indicante il percorso della chiamata ed uno la funzione che la gestirà;
- infine si attiverà il server specificando su quale porta TCP rimane in ascolto.
Il codice
Definiremo il nostro archivio di persone in un modulo separato, ospitato dal file gestione.js, che conterrà un generatore di nomi, cognomi ed età casuali ed un oggetto gestionePersone contenente un array denominato elenco ed i metodi per la manipolazione dei dati:
Questo il codice del file gestione.js:
var generatoreCasuale={
nomiUomo: ['Carlo','Simone','Federico','Alessio','Enrico','Luca','Giovanni','Giuseppe','Ernesto','Mario','Fabio','Angelo'],
cognomi: ['Rossi','Verdi','Gialli','Arancioni','Azzurri','Marroni','Neri','Bianchi','Celesti'],
elementoCasuale: function(elenco)
{
return elenco[Math.floor(Math.random()*10000%elenco.length)];
},
nomeCasuale: function()
{
return this.elementoCasuale(this.nomiUomo);
},
cognomeCasuale: function()
{
return this.elementoCasuale(this.cognomi);
},
etaCasuale: function()
{
return Math.floor(6+Math.random()*60);
}
};
var gestionePersone={
elenco:[],
tutti: function()
{
return this.elenco
},
nuovo: function()
{
nuovoTizio={nome: generatoreCasuale.nomeCasuale(), cognome: generatoreCasuale.cognomeCasuale(), eta: generatoreCasuale.etaCasuale()};
this.elenco.push(nuovoTizio);
},
creaCasuali: function(n)
{
for (i=0; i<n; i++)
this.nuovo();
}
};
exports.gestionePersone=gestionePersone;
In pratica, quello che abbiamo fatto, con tanta semplicità, è stata la creazione di un nostro modulo per Node.js. Notare che all’ultima riga gestionePersone è stato accodato all’oggetto globale exports tramite il quale verrà messo a disposizione dell’applicazione.
Il file app.js invece rappresenta il vero e proprio server. In esso, attiveremo l’uso di Express secondo le fasi che abbiamo elencato poco fa:
var express = require('express');
var db= require('./gestione');
var app = express();
app.post('/elenco/crea/:quanti', function (req, res) {
db.gestionePersone.creaCasuali(req.params.quanti);
res.end();
});
app.get('/elenco/tutti', function (req, res) {
res.send(db.gestionePersone.tutti());
});
app.listen(4156, function () {
console.log('Server in esecuzione sulla porta 4156...');
});
Le funzioni che usiamo come handler dei metodi get e post ricevono in input due parametri, req e res, che corrispondono, rispettivamente, alla richiesta e alla risposta HTTP. Tramite req.params leggeremo i parametri contenuti nell’invocazione mentre con i metodi di res gestiremo il flusso della risposta: abbiamo usato, in particolare, send per l’invio di un testo al client e end per determinare la fine dell’elaborazione lato server.
Sperimentiamo le nostre API
A questo punto non resta da far altro che avviare il server con il comando node:
> node app.js
Riceveremo in output la stringa “Server in esecuzione sulla porta 4156…” ma vedremo che il prompt del terminale non ritorna: questo a significare che il nostro server è attivo ed in attesa di connessioni.
Lo proveremo tramite Postman, un’estensione del browser Chrome specializzata nel test del protocollo HTTP ma il lettore potrà scegliere un altro strumento di suo gradimento.
Supponiamo di aver avviato il servizio all’indirizzo IP 192.168.1.100, in base alle impostazioni di cui abbiamo parlato, potremo invocare le due funzionalità definite in app.js con le seguenti invocazioni:
- http://192.168.1.100:4156/elenco/tutti con il metodo GET per richiedere l’elenco dei dati presenti nell’array;
- http://192.168.1.100:4156/elenco/crea/10 con il metodo POST per richiedere la creazione dei dati casuali di 10 persone. Ovviamente, sostituendo il numero 10 con altro parametro, determineremo la creazione di un numero diverso di oggetti.
L’immagine che segue mostra una schermata di Postman in cui abbiamo svolto l’invocazione GET per la lettura dei dati (notare i due campi in alto) ed abbiamo ottenuto il contenuto dell’array visibile nel corpo centrale dell’interfaccia espresso come tipica struttura dati Javascript.
Conclusioni
Quanto visto oggi non è che l’inizio di tutto quello che si può creare con Node.js a livello di fornitura di funzionalità lato server. Nelle prossime lezioni, approfondiremo i vari discorsi aperti oggi, imparando a strutturare in maniera più completa un’applicazione basata su Express.js e ad associare un database vero e proprio alla nostra installazione di Node.js.
Alla prossima!












No Responses to “Creare API REST con Node.js ed Express.js”