031.2 Lezione 1
Certificazione: |
Web Development Essentials |
---|---|
Versione: |
1.0 |
Argomento: |
031 Sviluppo Software e Tecnologie Web |
Obiettivo: |
031.2 Architettura di un’Applicazione Web |
Lezione: |
1 di 1 |
Introduzione
La parola applicazione ha un ampio significato nel gergo tecnologico. Quando l’applicazione è un programma tradizionale, eseguito localmente e autosufficiente nel suo scopo, sia l’interfaccia operativa dell’applicazione sia le componenti di elaborazione dati sono integrate in un unico “pacchetto”. Una web application è diversa perché adotta il modello client/server e la sua parte client è basata su HTML, che è ottenuto dal server e, in generale, reso attraverso un browser.
Client e Server
Nel modello client/server, parte del lavoro viene fatto localmente sul lato client e parte del lavoro viene fatto in remoto, sul lato server. Quali compiti vengono eseguiti da ciascuna parte varia a seconda dello scopo dell’applicazione, ma in generale spetta al client fornire un’interfaccia all’utente e impaginare il contenuto in modo attraente. Spetta al server eseguire la parte elaborativa dell’applicazione, elaborando e rispondendo alle richieste fatte dal client. In un’applicazione di shopping, per esempio, l’applicazione client visualizza un’interfaccia per l’utente per scegliere e pagare i prodotti, ma la fonte dei dati e i record delle transazioni sono tenuti sul server remoto, a cui si accede tramite la rete. Le applicazioni web eseguono questa comunicazione su Internet, di solito tramite il protocollo HTTP (Hypertext Transfer Protocol).
Una volta caricato dal browser, il lato client dell’applicazione inizia l’interazione con il server quando necessario o conveniente. I server di applicazioni web offrono un’interfaccia di programmazione di applicazioni (API) che definisce le richieste disponibili e il modo in cui queste richieste devono essere fatte. Così, il client costruisce una richiesta nel formato definito dall’API e la invia al server, che controlla i prerequisiti per la richiesta e rimanda la risposta appropriata.
Mentre il client, sotto forma di applicazione mobile o browser desktop, è un programma autonomo per quanto riguarda l’interfaccia utente e le istruzioni per comunicare con il server, il browser deve ottenere la pagina HTML e i componenti associati — come immagini, CSS e JavaScript — che definiscono l’interfaccia e le istruzioni per comunicare con il server.
I linguaggi di programmazione e le piattaforme usate da client e server sono indipendenti, ma usano un protocollo di comunicazione reciprocamente comprensibile. La parte server è quasi sempre eseguita da un programma senza interfaccia grafica, che gira in ambienti informatici altamente disponibili in modo che sia sempre pronto a rispondere alle richieste. Al contrario, la parte client viene eseguita su un qualsiasi dispositivo che è in grado di mostrare un’interfaccia HTML, come smartphone, pc e cos' via.
Oltre a essere essenziale per certi scopi, l’adozione del modello client/server permette a un’applicazione di ottimizzare diversi aspetti dello sviluppo e della manutenzione, poiché ogni parte può essere progettata per il suo scopo specifico. Un’applicazione che visualizza mappe e percorsi, per esempio, non ha bisogno di avere tutte le mappe memorizzate localmente. Solo le mappe relative alla posizione di interesse dell’utente sono richieste, quindi solo quelle mappe sono richieste dal server centrale.
Gli sviluppatori hanno il controllo diretto sul server, quindi possono anche modificare il client che viene fornito da esso. Questo permette agli sviluppatori di migliorare l’applicazione, in misura maggiore o minore, senza che l’utente debba esplicitamente installare nuove versioni.
La Parte Client
Un’applicazione web dovrebbe funzionare allo stesso modo su uno qualsiasi dei browser più popolari, a patto che il browser sia aggiornato. Alcuni browser possono essere incompatibili con le recenti innovazioni, ma solo le applicazioni sperimentali utilizzano caratteristiche non ancora ampiamente adottate.
I problemi di incompatibilità erano più comuni in passato, quando i diversi browser avevano il proprio motore di rendering e c’era meno cooperazione nel formulare e adottare standard. Il motore di rendering è il componente principale del browser, in quanto è responsabile della trasformazione dell’HTML e di altri componenti associati negli elementi visivi e interattivi dell’interfaccia. Alcuni browser, in particolare Internet Explorer, avevano bisogno di un trattamento speciale nel codice per non compromettere il funzionamento previsto delle pagine.
Oggi ci sono differenze minime tra i principali browser e le incompatibilità sono rare. I browser Chrome ed Edge usano lo stesso motore di rendering (chiamato Blink). Il browser Safari, e altri browser offerti sull'App Store di iOS, usano il motore WebKit. Firefox usa un motore chiamato Gecko. Questi tre motori rappresentano praticamente tutti i browser usati oggi. Anche se sviluppati separatamente, i tre motori sono progetti open source e c’è cooperazione tra gli sviluppatori, il che facilita la compatibilità, la manutenzione e l’adozione di standard.
Poiché gli sviluppatori di browser hanno fatto tanti sforzi per rimanere compatibili, il server non è normalmente legato a un solo tipo di client. In linea di principio, un server HTTP può comunicare con qualsiasi client che sia anche in grado di comunicare via HTTP. In un’applicazione di mappe, per esempio, il client può essere un’applicazione mobile o un browser che carica l’interfaccia HTML dal server.
Tipi di Client Web
Ci sono applicazioni mobile e desktop la cui interfaccia è resa tramite HTML e, come i browser, possono usare JavaScript come linguaggio di programmazione. Tuttavia, a differenza del client caricato nel browser, l’HTML e i componenti necessari al funzionamento del client nativo sono presenti localmente dall’installazione dell’applicazione. Un’applicazione che funziona in questo modo è virtualmente identica a una pagina HTML (è persino probabile che entrambe siano rese dallo stesso motore). Ci sono anche le progressive web apps (PWA), che permettono di “impacchettare” i client delle applicazioni web per l’uso offline - limitatamente alle funzioni che non richiedono una comunicazione immediata con il server. Per quanto riguarda ciò che l’applicazione può fare, non c’è differenza tra l’esecuzione nel browser o confezionata in una PWA, tranne che in quest’ultima lo sviluppatore ha più controllo su ciò che viene memorizzato localmente.
Il rendering delle interfacce HTML è un’attività così ricorrente che il motore è di solito un componente software separato, presente nel sistema operativo. La sua presenza come componente separato permette ad applicazioni diverse di incorporarlo senza doverlo incorporare nel pacchetto dell’applicazione. Questo modello delega anche la manutenzione del motore di rendering al sistema operativo, facilitando gli aggiornamenti. È molto importante mantenere aggiornato un componente così cruciale per evitare possibili problematiche.
Indipendentemente dal loro metodo di consegna, le applicazioni scritte in HTML girano su un livello di astrazione creato dal motore, che funziona come un ambiente di esecuzione isolato. In particolare, nel caso di un client che gira sul browser, l’applicazione ha a disposizione solo le risorse offerte dal browser. Le funzionalità di base, come l’interazione con gli elementi della pagina e la richiesta di file tramite HTTP, sono sempre disponibili. Le risorse che possono contenere informazioni sensibili, come l’accesso ai file locali, la posizione geografica, la fotocamera e il microfono, richiedono l’autorizzazione esplicita dell’utente prima che l’applicazione sia in grado di utilizzarle.
Linguaggi di un Client Web
L’elemento centrale di un client di un’applicazione web che gira sul server è il documento HTML. Oltre a presentare gli elementi dell’interfaccia che il browser visualizza in modo strutturato, il documento HTML contiene gli indirizzi di tutti i file necessari per la corretta presentazione e funzionamento del client.
L’HTML da solo non ha molta versatilità per costruire interfacce più elaborate e non ha caratteristiche di programmazione generale. Per questo motivo, un documento HTML che deve funzionare come applicazione client è sempre accompagnato da uno o più set di CSS e JavaScript.
Il CSS (Cascading Style Sheets) può essere fornito come file separato o direttamente nel file HTML stesso. Lo scopo principale dei CSS è quello di regolare l’aspetto e la disposizione degli elementi dell’interfaccia HTML. Anche se non è strettamente necessario, le interfacce più sofisticate di solito richiedono modifiche alle proprietà CSS degli elementi per soddisfare le loro esigenze.
JavaScript è un componente praticamente indispensabile. Le procedure scritte in JavaScript rispondono a eventi nel browser. Questi eventi possono essere causati dall’utente e non. Senza JavaScript, un documento HTML è praticamente limitato al testo e alle immagini. L’uso di JavaScript nei documenti HTML permette di estendere l’interattività oltre i collegamenti ipertestuali e i moduli, rendendo la pagina visualizzata dal browser come un’interfaccia di applicazione convenzionale.
JavaScript è un linguaggio di programmazione genico, ma il suo uso principale è nelle applicazioni web. Le caratteristiche dell’ambiente di esecuzione del browser sono accessibili attraverso parole chiave JavaScript, utilizzate in uno script per eseguire l’operazione desiderata. Il termine document
, per esempio, è usato nel codice JavaScript per riferirsi al documento HTML associato al codice JavaScript. Nel contesto del linguaggio JavaScript, document
è un oggetto globale con proprietà e metodi che possono essere usati per ottenere informazioni da qualsiasi elemento del documento HTML. Ancora più importante, si può usare l’oggetto document
per modificare i suoi elementi e associarli ad azioni personalizzate scritte in JavaScript.
Un’applicazione client basata su tecnologie web è multipiattaforma, perché può essere eseguita su qualsiasi dispositivo che abbia un browser web compatibile.
Essere confinati al browser, tuttavia, impone limitazioni alle applicazioni web rispetto alle applicazioni native. L’intermediazione effettuata dal browser permette una programmazione di livello superiore e aumenta la sicurezza, ma aumenta anche l’elaborazione e il consumo di memoria.
Gli sviluppatori lavorano continuamente sui browser per fornire più funzioni e migliorare le prestazioni delle applicazioni JavaScript, ma ci sono aspetti intrinseci all’esecuzione di script come JavaScript che impongono uno svantaggio rispetto ai programmi nativi per lo stesso hardware.
Una caratteristica che migliora significativamente le prestazioni delle applicazioni JavaScript in esecuzione sul browser è WebAssembly. WebAssembly è un tipo di JavaScript compilato che produce codice sorgente scritto in un linguaggio più efficiente e di livello inferiore, come il linguaggio C. WebAssembly può accelerare principalmente le attività ad alta intensità di processore, perché evita gran parte della traduzione eseguita dal browser quando si esegue un programma scritto in JavaScript convenzionale.
Indipendentemente dai dettagli di implementazione dell’applicazione, tutto il codice HTML, CSS, JavaScript e i file multimediali devono prima essere ottenuti dal server. Il browser ottiene questi file proprio come una pagina Internet, cioè con un indirizzo a cui il browser accede.
Una pagina web che funge da interfaccia per un’applicazione web è come un semplice documento HTML, ma aggiunge ulteriori comportamenti. Nelle pagine convenzionali l’utente viene indirizzato a un’altra pagina dopo aver cliccato su un link. Le applicazioni web possono presentare la loro interfaccia e rispondere agli eventi dell’utente senza caricare nuove pagine nella finestra del browser. La modifica di questo comportamento standard nelle pagine HTML viene fatta tramite la programmazione JavaScript.
Un client webmail, per esempio, visualizza i messaggi e passa da una cartella all’altra senza lasciare la pagina. Questo è possibile perché il client usa JavaScript per reagire alle azioni dell’utente e fare richieste appropriate al server. Se l’utente clicca sull’oggetto di un messaggio nella posta in arrivo, un codice JavaScript associato a questo evento richiede il contenuto di quel messaggio al server (usando la chiamata API corrispondente). Non appena il client riceve la risposta, il browser visualizza il messaggio nella porzione appropriata della stessa pagina. Diversi client webmail possono adottare strategie diverse, ma tutti usano questo stesso principio.
Quindi, oltre a fornire i file che compongono il client al browser, il server deve anche essere in grado di gestire richieste come quella del client webmail, quando chiede il contenuto di un messaggio specifico. Ogni richiesta che il client può fare ha una procedura predefinita per rispondere sul server, le cui API possono definire diversi metodi per identificare a quale procedura si riferisce la richiesta. I metodi più comuni sono:
-
Indirizzi, attraverso uno Uniform Resource Locator (URL)
-
Campi nelle intestazioni HTTP
-
metodi GET/POST
-
WebSocket
Un metodo può essere più adatto di un altro, a seconda dello scopo della richiesta e di altri criteri presi in considerazione dallo sviluppatore. In generale, le applicazioni web utilizzano una combinazione di metodi, ognuno in una circostanza specifica.
Il paradigma Representational State Transfer (REST) è ampiamente utilizzato per la comunicazione nelle applicazioni web, perché si basa sui metodi di base disponibili in HTTP. L’intestazione di una richiesta HTTP inizia con una parola chiave che definisce l’operazione di base da eseguire: GET
, POST
, PUT
, DELETE
, ecc., accompagnata da un URL corrispondente dove l’azione sarà applicata. Se l’applicazione richiede operazioni più specifiche, con una descrizione più dettagliata dell’operazione richiesta, il protocollo GraphQL può essere una scelta più appropriata.
Le applicazioni sviluppate utilizzando il modello client/server sono soggette a instabilità nella comunicazione. Per questo motivo, l’applicazione client deve sempre adottare strategie di trasferimento dati efficienti per favorire la sua coerenza e non danneggiare l’esperienza dell’utente.
Il Lato Server
Nonostante sia l’attore principale di un’applicazione web, il server è il lato passivo della comunicazione, rispondendo solo alle richieste fatte dal client. Nel gergo web, server può riferirsi alla macchina che riceve le richieste, al programma che gestisce specificamente le richieste HTTP, o allo script destinatario che produce una risposta alla richiesta. Quest’ultima definizione è la più rilevante nel contesto dell’architettura delle applicazioni web, ma sono tutte strettamente correlate. Anche se sono solo parzialmente nell’ambito dello sviluppatore di applicazioni server, la macchina, il sistema operativo e il server HTTP non possono essere ignorati, perché sono fondamentali per il funzionamento del server di applicazioni e spesso si intersecano.
Gestire i Percorsi dalle Richieste
I server HTTP, come Apache e NGINX, di solito richiedono modifiche di configurazione specifiche per soddisfare le esigenze dell’applicazione. Per impostazione predefinita, i server HTTP tradizionali associano direttamente il percorso indicato nella richiesta a un file sul file system locale. Se il server HTTP di un sito web mantiene i suoi file HTML nella directory /srv/www
, per esempio, una richiesta con il percorso /it/about.html
riceverà come risposta il contenuto del file /srv/www/it/about.html
, se il file esiste. Siti web più sofisticati, e specialmente applicazioni web, richiedono trattamenti personalizzati per diversi tipi di richieste. In questo scenario, parte dell’implementazione dell’applicazione consiste nel modificare le impostazioni del server HTTP per soddisfare i requisiti dell’applicazione.
In alternativa ci sono framework che permettono di integrare la gestione delle richieste HTTP e l’implementazione del codice dell’applicazione in un unico luogo, permettendo allo sviluppatore di concentrarsi più sullo scopo dell’applicazione che sui dettagli della piattaforma. In Node.js Express, per esempio, tutta la mappatura delle richieste e la programmazione corrispondente sono implementate utilizzando JavaScript. Dato che la programmazione dei client è di solito fatta in JavaScript, molti sviluppatori considerano una buona idea dal punto di vista della manutenzione del codice usare lo stesso linguaggio per client e server. Altri linguaggi comunemente usati per implementare la parte server, sia nei framework che nei tradizionali server HTTP, sono PHP, Python, Ruby, Java e C#.
Sistemi di Gestione di Database
Sta alla discrezione del team di sviluppo come i dati ricevuti o richiesti dal client vengono memorizzati sul server, ma ci sono linee guida generali che si applicano alla maggior parte dei casi. È conveniente mantenere il contenuto statico - immagini, codice JavaScript e CSS che non cambiano a breve termine - come file convenzionali, o sul file system del server o distribuito attraverso una content delivery network (CDN). Altri tipi di contenuto, come i messaggi di posta elettronica in un’applicazione webmail, i dettagli dei prodotti in un’applicazione di shopping, e i log delle transazioni, sono più convenientemente memorizzati in un database management system (DBMS).
Il tipo più tradizionale di sistema di gestione di database è la base di dati relazionale. In esso, il progettista dell’applicazione definisce le tabelle di dati e il formato di input accettato da ogni tabella. L’insieme delle tabelle nel database contiene tutti i dati dinamici consumati e prodotti dall’applicazione. Un’applicazione di shopping, per esempio, può avere una tabella che contiene una voce con i dettagli di ogni prodotto nel negozio e una tabella che registra gli articoli acquistati da un utente. La tabella degli articoli acquistati contiene riferimenti alle voci della tabella dei prodotti, creando relazioni tra le tabelle. Questo approccio può ottimizzare l’immagazzinamento e l’accesso ai dati, oltre a permettere interrogazioni in tabelle combinate usando il linguaggio adottato dal sistema di gestione del database. Il linguaggio di database relazionale più popolare è lo Structured Query Language (SQL, pronunciato “sequel”), adottato dai database open source SQLite, MySQL, MariaDB e PostgreSQL.
Un’alternativa ai database relazionali è una forma di database che non richiede una struttura rigida per i dati. Questi database sono chiamati database non relazionali o semplicemente NoSQL. Anche se possono incorporare alcune caratteristiche simili a quelle che si trovano nei database relazionali, l’obiettivo è quello di consentire una maggiore flessibilità nella memorizzazione e l’accesso ai dati memorizzati, passando il compito di elaborare tali dati all’applicazione stessa. MongoDB, CouchDB e Redis sono comuni sistemi di gestione di database non relazionali.
Gestione del Contenuto
Indipendentemente dal modello di database adottato, le applicazioni devono aggiungere dati e probabilmente aggiornarli nel corso della loro vita. In alcune applicazioni, come la webmail, gli utenti stessi forniscono dati al database quando usano il client per inviare e ricevere messaggi. In altri casi, come nell’applicazione di shopping, è importante permettere ai manutentori dell’applicazione di modificare il database senza dover ricorrere alla programmazione. Molte organizzazioni adottano quindi un qualche tipo di content management system (CMS), che permette agli utenti non tecnici di amministrare l’applicazione. Pertanto, per la maggior parte delle applicazioni web, è necessario implementare almeno due tipi di client: un client non privilegiato, utilizzato dagli utenti ordinari, e client privilegiati, utilizzati da utenti speciali per mantenere e aggiornare le informazioni presentate dall’applicazione.
Esercizi Guidati
-
Quale linguaggio di programmazione viene usato insieme all’HTML per creare applicazioni web client?
-
In che modo un’applicazione web differisce da un’applicazione nativa?
-
In che modo un’applicazione web differisce da un’applicazione nativa nell’accesso all’hardware locale?
-
Citare una caratteristica del client di un’applicazione web che lo distingue da una normale pagina web.
Esercizi Esplorativi
-
Quale caratteristica offrono i browser moderni per superare le scarse prestazioni dei client delle applicazioni web ad alta intensità di CPU?
-
Se un’applicazione web utilizza il paradigma REST per la comunicazione client/server, quale metodo HTTP dovrebbe essere utilizzato quando il client richiede al server di cancellare una risorsa specifica?
-
Citare cinque linguaggi di scripting per server supportati dal server HTTP Apache.
-
Perché i database non relazionali sono considerati più facili da mantenere e aggiornare dei database relazionali?
Sommario
Questa lezione tratta i concetti e gli standard della tecnologia e dell’architettura dello sviluppo web. Il principio è semplice: il browser web esegue l’applicazione client, che comunica con l’applicazione principale in esecuzione nel server. Anche se semplice nel principio, le applicazioni web devono combinare molte tecnologie per adottare il principio del calcolo client e server sul web. La lezione passa attraverso i seguenti concetti:
-
Il ruolo dei browser e dei server web.
-
Tecnologie e standard comuni di sviluppo web.
-
Come i client web possono comunicare con il server.
-
Tipi di server web e server di database.
Risposte agli Esercizi Guidati
-
Quale linguaggio di programmazione viene usato insieme all’HTML per creare applicazioni web client?
JavaScript.
-
In che modo un’applicazione web differisce da un’applicazione nativa?
Un’applicazione web non viene installata. Invece, parti di essa vengono eseguite sul server e l’interfaccia client viene eseguita in un normale browser web.
-
In che modo un’applicazione web differisce da un’applicazione nativa nell’accesso all’hardware locale?
Tutti gli accessi alle risorse locali, come lo storage, le telecamere o i microfoni, sono mediati dal browser e richiedono l’autorizzazione esplicita dell’utente per funzionare.
-
Citare una caratteristica del client di un’applicazione web che lo distingue da una normale pagina web.
L’interazione con le pagine web tradizionali è fondamentalmente limitata a collegamenti ipertestuali e all’invio di moduli, mentre i client delle applicazioni web sono più vicini a un’interfaccia di applicazione convenzionale.
Risposte agli Esercizi Esplorativi
-
Quale caratteristica offrono i browser moderni per superare le scarse prestazioni dei client delle applicazioni web ad alta intensità di CPU?
Gli sviluppatori possono usare WebAssembly per implementare le parti ad alta intensità di CPU dell’applicazione client. Il codice WebAssembly generalmente ha prestazioni migliori del tradizionale JavaScript, perché richiede meno traduzione di istruzioni.
-
Se un’applicazione web utilizza il paradigma REST per la comunicazione client/server, quale metodo HTTP dovrebbe essere utilizzato quando il client richiede al server di cancellare una risorsa specifica?
REST si basa su metodi HTTP standard, quindi in questo caso si dovrebbe usare il metodo standard
DELETE
. -
Citare cinque linguaggi di scripting per server supportati dal server HTTP Apache.
PHP, Go, Perl, Python, e Ruby.
-
Perché i database non relazionali sono considerati più facili da mantenere e aggiornare dei database relazionali?
A differenza dei database relazionali, i database non relazionali non richiedono che i dati si adattino a strutture rigide predefinite, rendendo più facile implementare cambiamenti nelle strutture dei dati senza influenzare i dati esistenti.