63 Chiamata AJAX per estrarre dati da php
Vedremo in questa lezione come trasformare una chiamata AJAX che fa uso dell’oggetto XMLHttpRequest in promise. Creiamo il nostro file promise.html
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Promises</title>
<script src="ajax.js"></script>
</head>
<body>
<h1>Ajax</h1>
</body>
</html>
In aggiunta, avremo anche un file index.php che contiene un array con dei dati e li restituisce con JSON
<?php
$data =[
[
'title' => 'PHP7 la guida completa',
'author' => 'faghy',
'date_published' => '2018-01-01'
],
[
'title' => 'HTML5 CSS3 la guida completa',
'author' => 'faghy',
'date_published' => '2017-01-01'
],
[
'title' => 'Javacript, la guida completa',
'author' => 'faghy',
'date_published' => '2019-01-01'
]
];
header('Content-type:application/json');
echo json_encode($data);
exit;
l’array data di php ha una struttura simile agli array di js. L’ header Content-type:application/json dichiara che il tipo di dati è JSON, mentre il metodo encode di php trasforma i dati dell’array $data in una stringa JSON.
Come si faceva col vecchio metodo, andremo ad effettuare una chiamata AJAX da js per trasformare i dati dell’array di php in una stringa JSON.
Andiamo ad aggiungere nel <body> del nostro file un <div> dove verranno inseriti i dati prelevati dal file php
<div id="content"></div>
Visto che con js andremo a modificare il DOM aggiungiamo un Listener nel file Ajax.js che andiamo a creare
window.onload = function () {
alert('loaded');
}
Lanciamo un alert di prova per assicurarci che il file js sia caricato. Ora che abbiamo la conferma che il js viene caricato, cancelliamo l’ alert e effettuiamo la chiamata AJAX istanziando l’oggetto XMLHttpRequest.
let xhr = new XMLHttpRequest();
xhr.open('GET', 'index.php');
xhr.send();
Lanciamo il metodo open che richiede come parametri il tipo di metodo che nel nostro caso è GET e il percorso. Infine inviamo i dati col metodo send.
Ora verifichiamo lo stato della chiamata col metodo readyState che nel caso ha successo si trova nello stato 200
xhr.readyState = function () {
if(xhr.status === 200) {
let obj = JSON.parse(xhr.responseText);
}
}
Se l’esito del confronto di status è positivo catturiamo nell’oggetto obj col metodo JSON.parse, la stringa che ci viene restituita con responseText . Aggiungiamo la parte di errore usando il metodo error se il confronto non va a buon fine
xhr.error = () => {
"use strict";
alert('Problemi di risposta dal server');
}
Ispezionando il codice dall’inspector del browser, nella tab rete possiamo vedere la nostra chiamata xhr effettuata via GET con stato 200 se tutto è andato correttamente. Nella parte risposta dovremmo poter vedere i nostri dati dell’array php. Ad ogni modo aggiungiamo l’oggetto obj in console per vederli meglio e sostituiamo il metodo readyState che corrisponde solo ad uno stato col metodo onreadystatechange che corrisponde ad un evento e aggiungiamo anche un controllo sul readyState uguale a 4 che significa che è conclusa la chiamata
xhr.onreadystatechange = function () {
if(xhr.readyState === 4 && xhr.status === 200) {
let obj = JSON.parse(xhr.responseText);
console.log(obj);
}
};
Il readyState delle chiamate AJAX sono 5:
- 0 ancora la chiamata non è stata inviata
- 1 il metodo open è stato invocato
- 2 la chiamata è stata inviata con send e sono disponibili gli headers HTTP
- 3 i dati sono in download
- 4 la chiamata è completata
Ora che abbiamo i dati in console parsificati come stringa nell’oggetto obj e tutto funziona correttamente, possiamo per esempio ciclarli e inerirli nella pagina HTML come lista <ul> al posto dell’oggetto in console
let ul = '<ul>'; ul += obj.map((book) => '<li>' + book.title + '</li>'); ul += '</ul>';