PREREQUISITI
- Per chi come me utilizza Visual Studio Code come editor, per eseguire gli esempi di codice riportati, occorre installare un web server
locale. Io ho utilizzato l’estensione Live Server. Una volta installata per eseguire una richiesta AJAX fare click con il tasto destro sulla pagina HTML e caricare la pagina con il server installato.
- Un esempio esegue una richiesta AJAX di tipo POST. I dati vengono inviati ad uno script PHP. Se hai seguito il mio corso sul PHP sai che per eseguire uno script in Windows occorre aver installato il web server Apache in ascolto sulla porta 80. Una volta installato il web server tramite XAMPP e dopo averlo avviato, posiziona lo script dentro la cartella htdocs. Maggiori informazioni le trovi nel mio post introduttivo sul PHP. Ti lascio il link: https://www.marcoalbasini.com/2022/07/introduzione-al-linguaggio-php/
CODICE SINCRONO E ASINCRONO
Il codice asincrono non è altro che codice che non va a bloccare l’esecuzione delle altre istruzioni di programma. Sappiamo che l’elemento fondamentale della rete internet è lo scambio dati fra host. Una strategia non intelligente sarebbe quella di fare in modo che questo scambio dati avvenga in modo sincrono, quindi bloccare il codice e mettersi in attesa della risposta. Una strategia migliore è quella di fare in modo di consentire al programma di effettuare la richiesta per poi continuare la sua esecuzione; quindi, non andiamo a bloccare l’esecuzione delle altre istruzioni in attesa della risposta. Questo modo di scrivere codice è chiamato programmazione asincrona.
INTRODUZIONE AD AJAX
Con AJAX (Asynchronous Javascript And Xml) possiamo fare richieste di rete in modo asincrono, recuperando informazioni da server esterni senza la necessità di ricaricare tutta la pagina. Anche se nell’acronimo abbiamo xml, in realtà Ajax può lavorare con file di testo e json, json che ha quasi del tutto sostituito l’xml come formato di scambio dati. L’oggetto XMLHttpRequest è il cuore di Ajax. Tramite questo oggetto possiamo effettuare le nostre richieste http di invio e ricezione dati. Vediamo ora con un esempio di codice come sia possibile leggere un file di testo in modo asincrono.
GESTIONE STATI RICHIESTA AJAX CON ONREADYSTATECHANGE
Una richiesta AJAX può assumere diversi stati. Per conoscere questi stati usiamo la proprietà readState. Facciamo un console.log(xhr) dove xhr è la costante che punta l’oggetto XMLHttpRequest; andiamo nell’oggetto prototype dove vediamo i vari stati che può assumere una richiesta AJAX. Riporto in basso l’immagine degli stati nel prototipo.
STATI DI UNA RICHIESTA AJAX
- Lo stato 0 viene assunto quando è stata creata l’istanza XMLHttpRequest()
- Stato 1 quando abbiamo invocato il metodo open
- Lo stato 2 quando abbiamo ricevuto gli headers di risposta
- Stato 3 quando i dati sono in fase di scaricamento
- Infine stato 4 quando l’operazione è completata
Per gestire le varie transizioni fra gli stati usiamo l’evento onreadystatechange, facendo uno switch sulla proprietà readyState. Per quanto riguarda il completamento dell’operazione, prima di accedere alla risposta dobbiamo controllare che l’operazione sia andata a buon fine. Questo lo facciamo con un test sulla proprietà status che deve assumere il valore 200.
AJAX E JSON
Creiamo un file JSON dove vengono descritti una serie di utenti. Così come abbiamo fatto per un file di testo, possiamo recuperare gli utenti tramite una richiesta AJAX che legge prima il file JSON in formato testuale poi lo trasforma in array javascript grazie al metodo parse. Il codice seguente illustra i passaggi.
INVIARE RICHIESTE DI TIPO POST
Con AJAX possiamo fare richieste di tipo POST, in tal caso saremo noi a inviare dati al server o ad uno script. In questo esempio invieremo una username ad uno script PHP, test.php che ritornerà un messaggio. Prima di inviare la request dobbiamo aggiungere un header di richiesta, per farlo utilizziamo il metodo setRequestHeader.
xhr.setRequestHeader(“Content-type“,”application/x-www-form-urlencoded“);
quello che vogliamo inviare allo script test.php lo inseriamo nel metodo send() sotto forma di chiave-valore.
xhr.send(‘username=’ + username);
Riporto il codice HTML della richiesta e lo script PHP.
RECUPERARE DATI DA API ESTERNE
JSON placeholder è un REST API che possiamo utilizzare ogni volta che abbiamo bisogno di dati di esempio. URL https://jsonplaceholder.typicode.com/ Possiamo effettuare delle richieste ed avere in risposta dei dati in formato JSON. Vediamo un esempio di codice.
AJAX E CALLBACK ASINCRONE
Creiamo un modulo httpRequest.js (i moduli li vedremo più avanti) per gestire richieste AJAX. In questo modo implementiamo astrazione e riutilizzo del codice. Se assegniamo il return this.responseText ad una variabile abbiamo undefined, cioè non riusciamo a recuperare il post 1. L’assegnamento è un’operazione sincrona mentre noi stiamo operando in modo asincrono, nel momento in cui definiamo la variabile non abbiamo il valore di ritorno della funzione. Qui entrano in gioco le callback asincrone, quello che possiamo fare è passare una callback alla funzione httpRequest, callback eseguita nel momento in cui abbiamo la risposta che viene passata come parametro alla callback stessa.
APPROFNDIMENTO AI
Le richieste AJAX (Asynchronous JavaScript and XML) sono un metodo utilizzato per eseguire richieste HTTP asincrone verso un server web, senza dover ricaricare la pagina. AJAX consente di aggiornare dinamicamente solo parte di una pagina, migliorando l’esperienza utente. Anche se il termine include “XML”, oggi le risposte sono più comunemente gestite in formati come JSON.
Ecco una descrizione dettagliata di come funzionano e come implementarle:
1. Creazione dell’oggetto XMLHttpRequest
La prima cosa da fare è creare un’istanza dell’oggetto XMLHttpRequest, che è il core delle richieste AJAX:
var xhr = new XMLHttpRequest();
2. Impostazione del tipo di richiesta
Per configurare la richiesta, si utilizza il metodo open(). Questo metodo prende tre parametri principali:
•Metodo: Il tipo di richiesta HTTP (GET, POST, PUT, etc.).
•URL: L’endpoint a cui inviare la richiesta.
•Asincrono: Se la richiesta deve essere asincrona (di solito true).
Esempio di una richiesta GET:
xhr.open(‘GET‘, ‘https://example.com/data‘, true);
3. Gestione della risposta
È importante definire una funzione di callback che gestirà la risposta del server. Questo può essere fatto tramite la proprietà onreadystatechange dell’oggetto XMLHttpRequest.
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// Successo: la risposta è disponibile
console.log(xhr.responseText); // Ottenere il contenuto come stringa
var data = JSON.parse(xhr.responseText); // Se la risposta è in JSON
console.log(data); // Visualizza l’oggetto JSON
}else if (xhr.readyState === 4 && xhr.status !== 200) {
// Fallimento: gestire l’errore
console.error(‘Errore durante la richiesta AJAX‘);
}
};
Stati di readyState
•0: L’oggetto è stato creato ma non ancora aperto.
•1: La connessione è stata aperta.
•2: La richiesta è stata ricevuta dal server.
•3: La richiesta è in fase di elaborazione.
•4: La richiesta è completata, la risposta è pronta.
4. Invio della richiesta
Dopo aver configurato la richiesta, la invii utilizzando il metodo send():
xhr.send();
Per le richieste POST, è necessario inviare anche i dati. Ecco un esempio con una richiesta POST:
xhr.open(‘POST‘, ‘https://example.com/api‘, true);
xhr.setRequestHeader(‘Content-Type‘, ‘application/json‘);
// Creazione del payload JSON
var payload = JSON.stringify({ key: ‘value’ });
// Invio della richiesta con il payload
xhr.send(payload);
5. Impostazione degli Headers
Per inviare informazioni aggiuntive al server (come token di autenticazione o tipo di contenuto), si possono impostare gli headers HTTP con setRequestHeader():
xhr.setRequestHeader(‘Authorization‘, ‘Bearer YOUR_ACCESS_TOKEN‘);
xhr.setRequestHeader(‘Content-Type‘, ‘application/json‘);
6. Gestione degli errori
Le richieste AJAX possono fallire per diversi motivi, come problemi di connessione o errori del server. È possibile gestire gli errori verificando lo stato (status) della risposta:
xhr.onerror = function() {
console.error(‘Errore di rete o problema con la richiesta AJAX.‘);
};
Conclusione
AJAX è un potente strumento per migliorare l’interattività e l’efficienza delle applicazioni web, permettendo di caricare dati in modo asincrono e aggiornare solo parte della pagina senza il bisogno di ricaricarla completamente. Oggi, per semplificare le richieste asincrone, molti sviluppatori preferiscono usare la Fetch API o librerie come Axios rispetto all’uso diretto di XMLHttpRequest.
Scrivi un commento