giovedì 30 ottobre 2014

AngularJs, Internet Explorer e la cache

Oggi ho combattuto un mostro invisibile: la cache di Internet Explorer.
Scrivendo un'applicazione con AngularJs, ricaricavo via XmlHttpRequest una lista, che ero sicuro doveva essere variata, e su Internet Explorer 11 ottenevo sempre gli stessi dati, mentre su Chrome e Firefox la lista veniva correttamente ricaricata.
Dopo quasi un giorno di ricerche, ho scoperto che il motivo è la cache.
Sembra che Internet Explorer faccia caching delle chiamate, almeno con AngularJs. Come specificato nell'esempio, un trucco molto semplice per "scuotere" IE è quello di passare a parametro un timestamp. Ma mi sembra poco elegante, sinceramente.
C'è un modo per far funzionare correttamente le cose, come ci spiegano in questo articolo, e cioè disabilitando la cache nell'http provider.
Da notare che la risposta, molto velocemente, dice di mettere un

$httpProvider.defaults.headers.get['If-Modified-Since'] = '0';

A me questa direttiva andava in conflitto con l'autenticazione, perchè cancellava tutti i cookies a bordo.
Invece, usando il codice

$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';

tutto funziona, anche l'autenticazione.

venerdì 24 ottobre 2014

File Upload con Spring

A completamento del post precedente, come fare a gestire l'upload di un file via Spring?
Spring offre un automatismo eccezionale per la gestione del file uplaod: in un controller, basta dichiarare un parametro di tipo MultipartFile per poter subito avere il file a portata di mano (vedi qui)
C'è una sola cosa da ricordarsi (e che invece puntualmente mi scordo): dichiarare nei beans un multipartResolver. Senza questa dichiarazione le cose non funzionano.
Se, come nell'esempio precedente, la chiamata viene da un framework come Angularjs, attenti al parametro ritorno! Anche se non è necessario comunicare niente al client, non omettere mai la declaration @ResonseBody

sabato 18 ottobre 2014

File Upload con Angularjs

Angular, essendo un framework Ajax-based, parte dal presupposto di fare tutte le chiamate via XMLHttpRequest. E allora, come si può fare un file-upload con Ajax?
Questo tutorial spiega molto bene come fare.
Le uniche due modifiche che farei sono sulla definizione di direttiva che viene data, e sulla serializzazione dell'oggetto.
L'esempio scrive nel codice dell'application una direttiva. Esiste però un modulo di Angularjs che fa esattamente la stessa cosa.
Sulla serializzazione dell'oggetto, l'esempio la fa mettendo, correttamente il Content-Type ad undefined, lasciando libero il modo di interpretare il contenuto all'applicazione ricevente (e al browser, che a volte lo completa automaticamente), mentre usa transformResponse: angular.identity.
Forse sarebbe più opportuno non demandare ad Angularjs la serializzazione, ma definirla in modo esplicito, magari così

transformResponse: function (data,) {
    return data;
}

Questo è quanto, poi bisognerebbe scrivere un post su come salvare sul server il contenuto.