{"id":11678,"date":"2016-04-26T10:10:06","date_gmt":"2016-04-26T08:10:06","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11678"},"modified":"2016-06-07T14:52:02","modified_gmt":"2016-06-07T12:52:02","slug":"creare-api-rest-con-node-js-ed-express-js","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/creare-api-rest-con-node-js-ed-express-js\/","title":{"rendered":"Creare API REST con Node.js ed Express.js"},"content":{"rendered":"<p>In un <a href=\"http:\/\/www.devapp.it\/wordpress\/introduzione-a-node-js\/\">articolo precedente<\/a>, abbiamo introdotto <strong>Node.js,<\/strong> un ambiente di esecuzione che permette di <strong>realizzare applicazioni in Javascript<\/strong> non destinate al browser.<br \/>\nProseguiamo il nostro viaggio in questa piattaforma imparando a predisporre delle API raggiungibili mediante invocazioni REST.<br \/>\nOltre a Node.js, che supporremo gi\u00e0 installato e funzionante, avremo bisogno di un suo modulo,\u00a0<a href=\"http:\/\/expressjs.com\/\" target=\"_blank\">Express.js<\/a>, che offre un&#8217;evoluta infrastruttura di rete.<\/p>\n<h2>Installiamo Express<\/h2>\n<p>Installeremo Express tramite <em>npm,\u00a0<\/em> come \u00e8 prassi nell&#8217;ambiente di\u00a0Node.js, quindi tutte le operazioni saranno svolte da riga di comando, indipendentemente dal sistema operativo che stiamo usando.<br \/>\nPer prima cosa, creiamo una cartella &#8211; nell&#8217;esempio la chiameremo\u00a0<em>myapp<\/em> &#8211; e ci spostiamo al suo interno:<\/p>\n<pre class=\"lang:js decode:true\">&gt; npm init<\/pre>\n<p>questo comando produce\u00a0il file <strong>package.json<\/strong> che in Node.js \u00e8 al centro della configurazione \u00a0dell&#8217;applicazione. Per produrlo ci verranno chieste alcune informazioni tra cui l&#8217;<em>entry point<\/em> ossia il nome del file Javascript che rappresenta l&#8217;avvio dell&#8217;applicazione: noi sceglieremo\u00a0di chiamarlo\u00a0app.js.<\/p>\n<p>A questo punto potremo installare express:<\/p>\n<pre class=\"lang:js decode:true\">&gt; npm install express --save<\/pre>\n<h2>Prepariamo l&#8217;esempio<\/h2>\n<p>Nell&#8217;esempio, gestiremo un elenco di persone &#8211; in realt\u00e0, rappresentati da un insieme di dati casuali &#8211; che vorremo rendere accessibile tramite API.<\/p>\n<p>Supporremo che l&#8217;utente conosca gi\u00e0 il pattern REST ma, tanto per fare un breve richiamo, ne riepilogheremo qui il concetto.<\/p>\n<p>Il protocollo HTTP \u00e8 il mezzo con cui vengono normalmente trasmesse le pagine Internet ed offre alcuni &#8220;metodi&#8221; 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 <em>dataset<\/em>: GET per la lettura, POST per la modifica, PUT per la creazione e DELETE per la cancellazione.<\/p>\n<p>Con Node.js ed Express insieme offriremo ai nostri oggetti Javascript un&#8217;interfaccia sulla Rete le cui funzionalit\u00e0 potranno essere\u00a0invocate\u00a0specificando un URL ed un metodo HTTP.<\/p>\n<p>I dati &#8211; almeno per questa lezione &#8211; non saranno custoditi \u00a0in un database bens\u00ec in un array di oggetti che rimarr\u00e0 &#8220;vivo&#8221; finch\u00e8 il nostro server basato su Node.js sar\u00e0 in esecuzione.<br \/>\nSecondo lo stile REST definiremo alcuni percorsi del server che saranno raggiungibili mediante metodi HTTP:<\/p>\n<ul>\n<li>il metodo <strong>GET<\/strong> permetter\u00e0 di richiedere l&#8217;elenco delle persone all&#8217;indirizzo <em>\/elenco\/tutti<\/em>;<\/li>\n<li>il metodo <strong>POST<\/strong> permetter\u00e0 di creare con dati casuali un certo numero di oggetti nell&#8217;elenco con la chiamata <em>\/elenco\/crea\/<\/em> concatenato con il numero di oggetti da produrre: ad esempio, invocando l&#8217;indirizzo \/elenco\/crea\/20 saranno generate le informazioni di 20 persone.<\/li>\n<\/ul>\n<p>Express.js sar\u00e0 approfondito nei prossimi tutorial, in questa lezione ci preoccuperemo, per lo pi\u00f9, di usarlo nel modo pi\u00f9 diretto possibile.<br \/>\nLe fasi che dovremo seguire saranno:<\/p>\n<ul>\n<li>integrazione del modulo tramite metodo <em>require: s<\/em>ubito dopo istanzieremo un oggetto che rappresenta il framework Express;<\/li>\n<li>definizione delle varie chiamate inoltrabili: l&#8217;oggetto <em>express<\/em> offrir\u00e0 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\u00e0;<\/li>\n<li>infine si attiver\u00e0 il server specificando su quale porta TCP rimane in ascolto.<\/li>\n<\/ul>\n<h2>Il codice<\/h2>\n<p>Definiremo il nostro archivio di persone in un modulo separato, ospitato dal file <em>gestione.js<\/em>, che conterr\u00e0 un generatore di nomi, cognomi ed et\u00e0 casuali ed un oggetto <em>gestionePersone<\/em> contenente un array denominato elenco ed i metodi per la manipolazione dei dati:<\/p>\n<p>Questo il codice del file <strong>gestione.js<\/strong>:<\/p>\n<pre class=\"lang:js decode:true\">var generatoreCasuale={\r\n\tnomiUomo: ['Carlo','Simone','Federico','Alessio','Enrico','Luca','Giovanni','Giuseppe','Ernesto','Mario','Fabio','Angelo'],\r\n\tcognomi: ['Rossi','Verdi','Gialli','Arancioni','Azzurri','Marroni','Neri','Bianchi','Celesti'],\r\n\t\r\n\telementoCasuale: function(elenco)\r\n\t{\r\n\t\treturn elenco[Math.floor(Math.random()*10000%elenco.length)];\r\n\t},\r\n\t\r\n\tnomeCasuale: function()\r\n\t{\r\n\t\treturn this.elementoCasuale(this.nomiUomo);\r\n\t},\r\n\t\r\n\tcognomeCasuale: function()\r\n\t{\r\n\t\treturn this.elementoCasuale(this.cognomi);\r\n\t},\r\n\t\r\n\tetaCasuale: function()\r\n\t{\r\n\t\treturn Math.floor(6+Math.random()*60);\r\n\t}\r\n\t\r\n\t\r\n};\r\n\r\nvar gestionePersone={\r\n\t\t\r\n\t\telenco:[],\r\n\t\t\r\n\t\ttutti: function()\r\n\t\t{\r\n\t\t\treturn this.elenco\r\n\t\t},\r\n\t\t\r\n\t\tnuovo: function()\r\n\t\t{\r\n\t\t\tnuovoTizio={nome: generatoreCasuale.nomeCasuale(), cognome: generatoreCasuale.cognomeCasuale(), eta: generatoreCasuale.etaCasuale()};\r\n\t\t\tthis.elenco.push(nuovoTizio);\r\n\t\t},\r\n\t\t\r\n\t\tcreaCasuali: function(n)\r\n\t\t{\r\n\t\t\tfor (i=0; i&lt;n; i++)\r\n\t\t\t\tthis.nuovo();\r\n\t\t}\r\n\t\r\n};\r\n\r\nexports.gestionePersone=gestionePersone;<\/pre>\n<p>In pratica, quello che abbiamo fatto,\u00a0con tanta semplicit\u00e0,\u00a0\u00e8 stata la creazione di un nostro modulo per Node.js. Notare che all&#8217;ultima riga gestionePersone \u00e8 stato accodato all&#8217;oggetto globale <strong>exports<\/strong> tramite il quale verr\u00e0 messo a disposizione dell&#8217;applicazione.<\/p>\n<p>Il file <strong>app.js<\/strong> invece rappresenta il vero e proprio server. In esso, attiveremo l&#8217;uso di Express secondo le fasi che abbiamo elencato poco fa:<\/p>\n<pre class=\"lang:js decode:true\">var express = require('express');\r\nvar  db= require('.\/gestione');\r\n\r\nvar app = express();\r\n\r\n\r\n\r\napp.post('\/elenco\/crea\/:quanti', function (req, res) {\r\n\tdb.gestionePersone.creaCasuali(req.params.quanti);\r\n\tres.end();\r\n});\r\n\r\napp.get('\/elenco\/tutti', function (req, res) {\r\n\tres.send(db.gestionePersone.tutti());\r\n});\r\n\r\napp.listen(4156, function () {\r\n  console.log('Server in esecuzione sulla porta 4156...');\r\n});<\/pre>\n<p>Le funzioni che usiamo come handler dei metodi <em>get<\/em> e <em>post\u00a0<\/em>ricevono in input due parametri, <em>req<\/em> e <em>res<\/em>, che corrispondono, rispettivamente, alla richiesta e alla risposta\u00a0HTTP. Tramite <em>req.params<\/em>\u00a0leggeremo\u00a0i parametri contenuti nell&#8217;invocazione mentre con i metodi di res gestiremo il flusso della risposta: abbiamo usato, in particolare, <em>send<\/em> per l&#8217;invio di un testo al client e <em>end<\/em> per determinare la fine dell&#8217;elaborazione lato server.<\/p>\n<h2>Sperimentiamo le nostre API<\/h2>\n<p>A questo punto non resta da far altro che avviare il server con il comando <em>node<\/em>:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; node app.js<\/pre>\n<p>Riceveremo in output la stringa &#8220;Server in esecuzione sulla porta 4156&#8230;&#8221; ma vedremo che il prompt del terminale non ritorna: questo a significare che il nostro server \u00e8 attivo ed in attesa di connessioni.<\/p>\n<p>Lo proveremo tramite <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/postman\/fhbjgbiflinjbdggehcddcbncdddomop\" target=\"_blank\">Postman<\/a>, un&#8217;estensione del browser Chrome specializzata nel test del protocollo HTTP ma il lettore potr\u00e0 scegliere un altro strumento di suo gradimento.<\/p>\n<p>Supponiamo di aver avviato il servizio all&#8217;indirizzo IP 192.168.1.100, in base alle impostazioni di cui abbiamo parlato, potremo invocare le due funzionalit\u00e0 definite in app.js con le seguenti invocazioni:<\/p>\n<ul>\n<li><em>http:\/\/192.168.1.100:4156\/elenco\/tutti<\/em> con il metodo GET per richiedere l&#8217;elenco dei dati presenti nell&#8217;array;<\/li>\n<li><em>http:\/\/192.168.1.100:4156\/elenco\/crea\/10<\/em> 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.<\/li>\n<\/ul>\n<p>L&#8217;immagine che segue mostra una schermata di Postman in cui abbiamo svolto l&#8217;invocazione GET per la lettura dei dati (notare i due campi in alto) ed abbiamo ottenuto il contenuto dell&#8217;array visibile nel corpo centrale dell&#8217;interfaccia espresso come tipica struttura dati Javascript.<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/01\/node-js-e-express-creaiamo-api-rest_img_01.jpg\" rel=\"attachment wp-att-11680\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11680\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/01\/node-js-e-express-creaiamo-api-rest_img_01.jpg\" alt=\"node-js-e-express-creaiamo-api-rest_img_01\" width=\"932\" height=\"525\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/01\/node-js-e-express-creaiamo-api-rest_img_01.jpg 932w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/01\/node-js-e-express-creaiamo-api-rest_img_01-300x169.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/01\/node-js-e-express-creaiamo-api-rest_img_01-768x433.jpg 768w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/a><\/p>\n<h2>Conclusioni<\/h2>\n<p>Quanto visto oggi non \u00e8 che l&#8217;inizio di tutto quello\u00a0che si pu\u00f2 creare con Node.js a livello di fornitura di funzionalit\u00e0 lato server. Nelle prossime lezioni, approfondiremo i vari discorsi aperti oggi, imparando a strutturare in maniera pi\u00f9 completa\u00a0un&#8217;applicazione basata su Express.js e ad associare un database vero e proprio alla nostra installazione di Node.js.<\/p>\n<p>Alla prossima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In un articolo precedente, abbiamo introdotto Node.js, un ambiente di esecuzione che permette di realizzare applicazioni in&#8230;<\/p>\n","protected":false},"author":561,"featured_media":11863,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1669,1538,1621,1670,1671,1537,1599],"class_list":["post-11678","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-express-js","tag-javascript","tag-js","tag-jsdeveloper","tag-jsdevs","tag-node-js","tag-programmatori-javascript"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11678","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=11678"}],"version-history":[{"count":9,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11678\/revisions"}],"predecessor-version":[{"id":12083,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11678\/revisions\/12083"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/11863"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11678"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}