RESTFul API con node.js ed express.js – Parte 1

RESTFul API Node.js  - RESTfulAPIs NodeJS - RESTFul API con node.js ed express.js – Parte 1

Le basi

Creo la cartella che contiene il progetto e creo il file app.js punto di origine dell’applicazione REST API.
Inizializzo il gestore di pacchetti npm col comando npm init, questo mi crea il file package.json che memorizza tutte le dipendenze delle librerie installate con la versione.
Installo la prima libreria, necessaria per la creazione del servizio:

npm install express --save

all’interno del file app.js scrivo il primo esempio di codice per testare il funzionamento:

const express = require('express');

// Set up the express app
const app = express();

app.get('/', function (req, res) {
  res.status(200).send({
    success: 'true',
    message: 'Hello World!'
  })
});
const PORT = 5000;

app.listen(PORT, () => {
  console.log(`server running on port ${PORT}`)
});

Per poter inviare informazioni in formato JSON alle API, è necessario installare la libreria body-parse:

npm install body-parser --save

importarla all’interno del progetto (app.js) e configurarla:

const body-parser = require('body-parser');

// Parse incoming requests data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

a questo punto le funzioni possono intercettare i valori passati nel body in formato JSON:

if(!req.body.title) {
   return res.status(400).send({
      success: 'false',
      message: 'title is required'
   });
}

questo per esempio verifica la presenza della chiave title all’interno del JSON e se non presente restituisce messaggio di errore.

Nel prossimo articolo vedremo come costruire un Middleware per gestire il routing delle chiamate alle API.

RESTFul API con node.js ed express.js – Parte 2

API Gateway Mapping

API Gateway  - API Gateway Diagram - API Gateway Mapping

Quando si utilizza il sistema di API Gateway di AWS, a volte, si ha la necessità di integrare i dati in arrivo dalla chiamata (passati dall’utente) a dati fissi oppure si ha la necessità di riorganizzare i dati in modo differente per poi poterli passare alla funziona Lambda.
Tramite il linguaggio VTL (Velocity Template Language) è possibile strutturare la mappa di integrazione con logiche personalizzate. Vediamo un esempio di integrazione semplice, dove ad ogni parametro in arrivo dalla chiamata, corrisponde un parametro passato alla Lambda.

#set($payload = $util.parseJson($input.json('$')))
{
    "pin": "demo",
    "action": "managealarm",
    "type": "$input.path('$.type')",
    "eventid": "$input.path('$.eventid')",
    "userid": "$input.path('$.userid')"
}

Non sembra di molta utilità, poiché non è dinamico e vincolato a parametri fissi, ma serve principalmente per aggiungere alcune chiave/valore specifici della chiamata.
Sicuramente più interessante è la possibilità di rendere dinamica la costruzione del JSON da restituire alla Lambda.

#set($payload = $util.parseJson($input.json('$')))
{
    "pin": "demo",
    "action": "command",
    "comname": "nome comando",
    "type": 2,
    "code": "$input.path('$.code')",
    "userid": "$input.path('$.userid')",
    "values": {
        #foreach($body in $payload.entrySet())
            #if ($body.key == "values")
                #foreach($valu in $body.value.entrySet())
                "$valu.key": "$valu.value"#if($foreach.hasNext),#end
                #end
            #end
        #end
    }
}

In questo caso, oltre ai parametri aggiuntivi con chiave e valore fissi e a quelli con chiave fissa ma con valore dinamico, si può vedere la costruzione dell’oggetto values in modo dinamico e si possono anche introdurre dei controlli, per esempio se il dato è valorizzato.


http://velocity.apache.org/engine/devel/index.html

VTL