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>';