lundi 3 février 2014

Progressive XMLHttpRequest - Etat des lieux


Je ne reviens pas sur l'objet XMLHttpRequest, la fiche Wikipedia suffit : 
XMLHttpRequest est un objet ActiveX ou JavaScript qui permet d'obtenir des données au format XML, JSON, mais aussi HTML, ou encore texte simple à l'aide de requêtes HTTP.
On explique le succès récent de l'objet et la très grande utilisation qui en est faite actuellement (parfois au détriment de l'accessibilité d'un site) par la simple création du nom AJAX.
Si le mal nommé XMLHttpRequest (qui donc n'a rien à voir aujourd'hui avec le XML) permettait de faire beaucoup de choses, il y a une chose qu'il ne savait pas faire jusque là, c'était lire un flux continu HTTP (ou "stream") de manière progressive (traiter le contenu au fur et à mesure).

"Avant"

Jusqu'ici la seule possibilité qui nous était offerte était d'utiliser la valeur "text" pour la propriété responseType (donc définir que le contenu récupéré sera de type texte non formaté et encodé selon la valeur du header Content-Type ou UTF-8 par défaut) et de définir un callback sur l’événement "onreadystatechange" pour lire le contenu de la propriété "response".


Tout ça est fort sympathique mais ne sert pas à grand chose ...
  • Cette technique ne marche QUE si le contenu est du texte (comme précisé dans le WD), hors si les flux ne sont jamais (ou alors vraiment très rarement) du texte ; on souhaite avant tout du binaire (musique, vidéo, ...).
    On doit donc récupérer cette chaîne de caractère, la convertir en binaire en utilisant (ou souvent en devinant) son encodage. C'est une opération très coûteuse en cycles de CPU, ce qui est incompatible avec les flux ;
  • L'ensemble des données téléchargées depuis le flux est stockée dans la variable xhr.response. Je vous laisse imaginer les dégâts lorsque l'on atteint quelques centaines de méga-octets.