Quando si implementa AJAX su un applicativo è importante riuscire a sapere in dettaglio cosa stia inviando e quale risposta stia ricevendo l'oggetto asincrono. Alcuni ambienti di sviluppo hanno al loro interno una gestione integrata per effettuare debug ma purtroppo molti altri no.
Altri ancora necessitano di plugin aggiuntivi e le soluzioni potrebbero essere diverse. Una di queste è FireBug, un plugin che ha la capacità di aggiungere features interessanti oltre quelle presenti nella nota console JavaScript di FireFox quali il selettore di elementi dinamici creati ad esempio con un innerHTML o attraverso i metodi del DOM oppure il logging di tutto il traffico asincrono, con informazioni complete sulla chiamata e sulla richiesta.
Non bisogna però dimenticare che lato client il debug è possibile semplicemente implementando controlli temporanei, magari eliminandoli dalle versioni ufficiali dei vari progetti, al fine di sapere per ogni chiamata quale pagina si stà richiamando, cosa si sta inviando, il tipo di errore ricevuto, se presente, oppure il testo, qualora non dovesse essere quello atteso.
È facile dedurre che un tool o ambiente che sia, può darci una mano ma non è necessariamente indispensabile. Potrebbe esserlo invece sapere cosa accade lato server, al fine di avere un riscontro reale tra JavaScript e le operazioni effettuate dal linguaggio back-end.
Abbiamo scelto PHP e C# per mostrare un esempio di debug lato server, procedura molto simile a quella usata da tempo dagli sviluppatori Adobe per monitorare le interazioni con le classi asincrone. Tale esempio potrà essere quindi riutilizzato anche per creare report, in fase di sviluppo, con Flash.
Il codice proposto si basa sulla inizializzazione di una classe e la chiamata ad un solo metodo e l'insieme di queste due operazioni servirà a catturare quanto mostrato al client ed a salvarlo su un file di testo contenente anche i dati eventualmente richiesti in GET, in POST o in entrambi i modi.
InformazioniAjax.class.php
Questa la classe proposta per la versione PHP, da salvare col nome InformazioniAjax.class.php
.
Listato 24. Creare un report dello scambio di dati con PHP
<?php
// classe InformazioniAjax,
// crea un file di testo contenente i dati
// ricevuti dal client ed inviati allo stesso
class InformazioniAjax {
// variabile privata tipo stringa contenente l'output
var $__output = "";
// costruttore, assegna il dump delle variabili
// inviate in GET o POST ed avvia il gestore output
function InformazioniAjax() {
$this->__output =
"REPORT DEL ".
date("d/m/Y H:i:s")."rnrn".
"[VARIABILI GET]rn".
$this->__dump($_GET)."rn".
"---------------------------------rnrn".
"[VARIABILI POST]rn".
$this->__dump($_POST)."rn".
"_________________________________rnrn".
"[OUTPUT GENERATO]rn";
ob_start();
}
// metodo pubblico, crea un file contenente
// le informazioni presenti nella variabile __output
// alla quale verrà assegnato anche il contenuto della pagina
function creaReport($fileReport = "report.txt") {
$this->__output .= ob_get_contents();
ob_end_flush();
if(@$fp = fopen($fileReport, "w")) {
fwrite($fp, $this->__output);
fclose($fp);
}
else
exit("Impossibile creare il file ".$fileReport);
}
// metodo privato, crea una stringa
// contenente le coppie chiave/valore per
// il tipo di richiesta e la restituisce
function __dump($richiesta) {
$risultato = "";
while(list($chiave,) = each($richiesta))
$risultato .= $chiave . "rnt" . $richiesta[$chiave] . "rn";
return $risultato;
}
}
?>
Prima di poter sfruttare questa classe è necessario capire come usarla. Le operazioni sono due:
- inizializzazione, che ha il compito di assegnare alla stringa interna il dump delle variabili GET e POST e di avviare il gestore output attraverso la chiamata alla funzione
ob_start
, - ed il metodo creaReport, che accetta un nome di file in ingresso, di default report.txt, e che ha il compito di salvare in questo file il testo nella stringa interna con l'aggiunta del testo mostrato, attraverso la funzione ob_get_contents.
Unico tassello mancante è una pagina che piloti queste due operazioni. Possiamo creare un nuovo file e chiamarlo 'test.php
'.
Listato 25. Esempio di uso della classe InformazioniAjax
<?php
// file test.php,
// prima cosa da fare, inclusione della
// classe ed inizializzazione della stessa
require "InformazioniAjax.class.php";
$ajaxInfo = new InformazioniAjax();
// stampa dati di qualunque tipo, in questo
// caso una semplice stringa, un link ed un form
echo
"
Verifica del funzionamento del file di report<br />
<a href="?variabile=valore">prova una richiesta in get</a><br />
<form action="?altravar=altrovalore" method="post">
<input type="submit" name="form" value="invio dati in post" />
</form>
";
// ultima cosa da fare, richiamare il metodo
// creaReport al fine di salvare nel file
// le informazioni
$ajaxInfo->creaReport();
?>
Nello spazio compreso tra inizializzazione classe e chiamata a creaReport è possibile includere file,
connettersi al database, fare qualunque tipo di operazione e l'unico evento che potrà impedire
al report di essere creato è un errore fatale, solitamente visualizzabile lanciando la pagina
incriminata.
Salvando questo file come test.php e richiamandolo dal webserver, http://localhost/DEBUG/
, per esempio conentrambi i files presenti nella cartella DEBUG e dei permessi di scrittura per la stesse, ci si ritroverà in una pagina con pochi elementi e nessun JavaScript.
Questa sarà solo la pagina di prova che dovrà dare esiti positivi sia testando il link, sia cliccando sul bottone.
Per visualizzare il risultato è sufficiente aprire il file report.txt
creato all'interno della stessa cartella. Appurato il corretto funzionamento si ha la possibilità di aggiungere ad inizio e fine codice le parti utili per creare il report avendo così per ogni chiamata asincrona, tutte le informazioni necesarie.
Qualora tali chiamate dovessero essere simultanee o molteplici, basterà assegnare un file differente per ogni chiamata. La cosa importante comunque è capire quanto proposto al fine di riadattare al meglio il codice della classe alle proprie esigenze.
È possibile scaricare il codice PHP proposto per testarlo direttamente sulle nostre macchine.