Fiche Javascript AJAX : données, fichiers et dialogue client-serveur

Objet de la fiche :

État de la fiche En cours


Plan de la fiche

Avant propos

Les sites web dynamiques requièrent des mises à jour en temps réel et cela de manière transparente sans avoir à recharger la page. Cette méthodologie se retrouve sous plusieurs techniques, notamment l’utilisation des objets XMLHttpRequest de Javascript et est communément connue sous le nom AJAX. Au dela de la mise à jour de données en temps réel, cette technique permet aussi de télécharger des fichiers et de les manipuler avant de les présenter à l'internaute.


Le dialogue client serveur

Généralités

XML HTTP Request est basé sur le principe d'échange de données entre un client (la page WEB de l'internaute qui prend l'initiative de la connexion) et un serveur sur lequel se trouve la page ou l'application à laquelle la page Web veut accéder.

C'est donc une méthode de communication entre des applications dans le but d'aboutir à un échange de données entre les deux parties.
La communications peut être établie en mode connecté comme c'est le cas avec le protocole TCP (Transport Control Protocol) : les 2 ordinateurs établissent une liaison virtuelle avant le transfert effectif des données. Un message d'erreur est renvoyé si les informations ne sont pas correctement réceptionnées.
Ou en mode non connecté comme c'est le cas avec le protocole UDP (User Datagram Protocol) pour lequel l'envoi se fait sans aucun contrôle de la réception effective des informations ( UDP ne permet pas de transmettre les informations concernant l'émetteur).

Le point de communication entre les deux processus a pour nom socket : un socket et le résultat de la combinaison d’une adresse IP et d’un numéro de port. AInsi la combinaison de 2 sockets définit de manière complète et unique une connexion TCP ou un échange UDP

Note 1 : UDP est souvent utilisé pour des applications en diffusion/multidiffusion. Autre exemple pour des applications qui tolèrent la perte occasionnelle de petits paquets, mais exigent une grande vitesse de transmissions comme c'est le cas pour la voix sur IP.

Note 2 : Comme l'adresse IP qui sert à identifier de façon unique un ordinateur sur le réseau, le port (ou numéro de port) indique l'application à laquelle les données sont destinées. Chaque application possède ainsi son propre numéro de port. Certains port sont dit "réservés" (0 à 1023) : parmi les plus connus 21 pour le protocole FTP ou 80 pour le HTTP. Il existe aussi les ports dits "ports enregistrés" (1024 à 49151) et les ports "dynamiques et/ou privés".

Les diverses couches mise en jeu. Correspondances avec le système OSI

No couche OSI Nom de la couche Description Couche TCP/IP
7 Application Applications et services de communication standard à la disposition de tous les utilisateurs. NFS, NIS, DNS, LDAP, telnet, ftp, rlogin, rsh, rcp, RIP, RDISC, SNMP, etc.
6 Présentation Vérifie que les informations sont bien reçues par le système récepteur dans un format compréhensible pour celui-ci.
5 Session Gère les connexions et interruptions entre les systèmes coopératifs.
4 Transport Gère le transfert des données. Vérifie également que les données reçues sont identiques aux données transmises. TCP, UDP, SCTP
3 Réseau Gère l'adressage et la distribution des données sur les différents réseaux. IPv4, IPv6, ARP, ICMP
2 Liaison de données Prend en charge le transfert des données via le média réseau. PPP, IEEE 802.2
1 Physique Définit les caractéristiques du matériel réseau. Ethernet (IEEE 802.3), Token Ring, RS-232, FDDI, etc.

L'objet XML HTTP Request

Généralités

L'objet XML HTTP Request n'est pas limité à l'usage exclusif de documents XML, il peut recevoir ou envoyer tous types de données et supporte d'autres protocoles que HTTP (incluant file et ftp).

L’utilisation de XHR est relativement simple en soit. Il vous suffit d’instancier un objet de ce type, d’ouvrir une url (ou un fichier local à votre serveur si vous préférez) et d’envoyer une requête (de type GET ou POST) avec ou sans paramètres. Malgré le fait que l’objet XHR puisse être utilisé avec plusieurs types de protocole, nous ne nous intéresserons à son utilisation qu’au travers du protocole HTTP. Le code d’état HTTP de la requête (réponse) ainsi que les données (le document) qui lui sont rattachés seront disponibles via cette instance d’objet.
L’objet XHR dispose d’une méthode d’appel et de retour, ce qui permet au navigateur de continuer à fonctionner normalement jusqu’à ce que la requête envoyée aboutisse et soit traitée en retour.

Principe général

Méthodes

Tableau des méthodes
Méthodes Descriptions
abort() Anulation de la requête courante.
getAllResponseHeaders() Renvoi sous forme de chaine de caractères l'information complète du header http.
Date: Tue, 21 May 2013 22:37:42 GMT
Server: Apache/ProXad [Apr 20 2012 15:06:05]
Last-Modified: Tue, 21 May 2013 09:10:43 GMT
Etag: "5110fa3-509-519b3a13"
Accept-Ranges: bytes
Content-Length: 1289
Content-Type: application/xml
getResponseHeader("nom du header") Renvoi des informations spécifiques du header.
Obj.getResponseHeader("Last-Modified") va retourner Tue, 21 May 2013 09:10:43 GMT
ou
Obj.getResponseHeader("Etag") va retourner "5110fa3-509-519b3a13"
open("methode","URL",async,"unom","mdp") Specifie la methode, URL, et autres attributs optionnels d'une requête
Tableau des paramètres de open
Paramètres Descriptions
methode(1) Ce paramètre peut prendre les valeurs "GET", "POST", ou "PUT" (utiliser "GET" lorsque l'on désire recevoir des données, "POST" pour envoyer des données (particulièrement si la longeur des données est supérieure à 512 bytes.
URL Ce paramètre est une url soit relative ou complète.
async Ce paramètre specifie si la requête doit être exécutée de manière asynchrone ou pas. true signifie que le processus n'est pas bloqué en attente d'une réponse immédiate. false signifie que le processus attendra une réponse du serveur avant de continuer son exécution.
unom option : Nom utilisateur si l'accés demande un nom utilisateur ou login.
mdp option : Mot de passe utilisateur si l'accés demande un mot de passe utilisateur ou password.
send(chaine) Envoi de la requête.
"chaine" vide dans le cas ou l'on reçoit des informations (GET) ou chaine de caractères (POST) lors d'envoi de données vers le serveur.
setRequestHeader("label","valeur") Ajoute une paire label/valeur au header à transmettre. Cette méthode doit être appelée aprés la méthode open() et avant la méthode send().
Les entêtes de message HTTP ('HTTP headers' en anglais) sont utilisés pour décrire précisement une ressource requêtée ou le comportement du serveur ou du client.
Liste non exhaustives de headers courants :
Headers
Labels Commentaires
Accept Le ou les "content-types" accepté(s) pour la réponse. C'est de la responsabilité du serveur de prendre en compte cette demande. Exemples - Accept: text/plain ou Accept: text/plain, text/html
Accept-Charset Jeu(x) de caractères accepté(s) pour la requête et la réponse. Exemple - Accept-Charset: iso-8859-5, unicode-1-1
Accept-Language Langage(s) accepté(s) pour la requête et la réponse. Exemple - Accept-Charset: iso-8859-5, unicode-1-1
Content-Type Type de média envoyé au destinataire ou, dans le cas de la méthode HEAD le type de média envoyé. Exemple - Content-Type: text/html; charset=ISO-8859-4
Date Date au format GMT lorsque la requête est envoyée. Exemple - Tue, 15 Nov 1994 08:12:31 GMT

Propriétés

Tableau des propriétés
Propriétés Descriptions
.onreadystatechange Défini une fonction ou le nom d'une fonction qui sera automatiquement appellée chaque fois que la propriété readyState changera.
.readyState Supervision évènements générés lors de chaque changement d'état.
Cet évènement renvoie les informations suivantes :
0 = requête non initialisée.
1 = connexion établie avec le serveur.
2 = requête reçue.
3 = exécution requête en cours.
4 = requête terminée et réponse disponible.
.responseText Retourne la réponse sous forme de chaine de caractères.
.responseXML Retourne un 'XML document object' dont les données peuvent être examinées et 'parsées' avec les propriétés et méthodes des nodes(noeuds DOM).
status La demande est traitée et les informations de status sont disponibles sous forme numérique. Retourne le numéro de status(exp "404" pour "Not Found" ou "200" pour "OK").
statusText La demande est traitée et les informations de status sont disponibles sous forme texte. Retourne le texte de status(exp "Not Found" ou "OK").

Exemple de base

Le code suivant présente une fonction(StartXMLHttpRequest()) qu'il suffit d'appeler avec les paramètres requis pour récupérer l'information désirée.

4 paramètres sont à renseigner lors de l'appel de la fonction.

  • _location (chaîne) : adresse + paramètres éventuels de la page que l'on veut atteindre,
  • _Asynchrone (booleen): Demande synchrone (false) ou asynchrone (true),
  • _typeReponse (chaîne): Réponse de type fichier texte ("texte") ou xml ("xml"),
  • _typeAction (valeur): Fonction de traitement des résultats.

Exemple de syntaxe utilisée

On peut appeller la fonction de la façon suivante : StartXMLHttpRequest("http://toto.titi.fr",true,"texte",monResultat);

On traitera les résultats dans la fonction monResultat()

Le code général

Concrètement

Sécurité

Par défaut cet objet ne peut recevoir une réponse que sur le même serveur sur lequel la demande a été émise.

L'utilisation de cette fonctionnalité peut avoir des impacts sur votre application :

  • Premièrement, la plupart des navigateurs supportant cette fonctionnalité, doivent se connecter en http mais pas en "file" (acces direct au dique dur du pc), ce qui signifie que vous ne pourrez pas tester des pages d'un disque dur local sans quelques précautions de sécurité supplémentaires. Certain navigateur comme Mozilla exige que vous enveloppiez l'accès à l'objet à l'intérieur de UniversalBrowserRead pour se prémunir des privilèges de sécurité (alerte à l'utilisateur qu'une activité potentiellement dangereuse est en cours et offrir la possibilité d'annuler l'action).
  • Deuxièmement , le domaine de destination de la requête doit être le même que celui du serveur qui fourni la page web et qui contient le script. Cela signifie que TOUT doit venir du même domaine.

Note1 Transmissions de données ou fichiers. Les methodes post et get.

Habituellement seule la méthode GET est utilisée en particulier lorsque il n'y a pas ou peu de paramètres à transmettre au serveur. Toutefois il existe beaucoup de cas qui nécessitent l'utilisation de la méthode POST dans la création de la requête ajax comme par exemple pour des raisons de sécurité , ou lorsque l'on désire uploader un fichier, ou encore lorsque le nombre de paramètres est important.

De manière générale la méthode GET s'applique de la manière suivante :

Remarque : send() est envoyé avec le paramètre null.

De manière générale la méthode POST s'applique de la manière suivante :

Remarque sur "Content-type", "application/x-www-form-urlencoded") :

Les requêtes de type POST application/x-www-form-urlencode sont utilisées à la soumission d'un formulaire dont la propriété enctype a la valeur application/x-www-form-urlencode (c'est la valeur par défaut). Le format d'encodage des données est le même que pour les paramètres GET.

A titre d'information il existe des requêtes POST multipart/form-data. Ces requêtes sont utilisées à la soumission d'un formulaire dont la propriété entype est à multipart/form-data. Le format est plus complexe que pour les POST application/x-www-form-urlencode, car elles doivent permettre d'envoyer des fichiers en plus des données (pour s'y retrouver fichiers et données sont alors séparés par un élément séparateur dénommé bondary (frontière).

Récupération de données ou fichiers

Données sous forme de fichiers XML

Format général d'un fichier XML

XML pour Extensible Markup Language a été défini en 1998 par le World Wide Web Consortium (W3C).

Un document XML consiste en une liste d'éléments, chaque élément est défini par un contenu toujours encadré par une balise de départ et une balise de fin. Le nom de la balise peut être un nom quelconque.
Un document XML doit posséder un unique élément racine qui englobe l'ensemble des éléments. XML fait la différence entre majuscules et minuscules.

Un document XML doit respecter les règles suivantes lors de sa construction :

  • Le fichier démarre toujours par un prologue : qui décrit le fichier. Ce prologue peut être minimal (<?xml version="1.0"?> ou peut contenir des suppléments d'informations comme par exemple <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>.
    Note standalone : si le document XML fait référence à une DTD ou à des entités définies dans un autre fichier, il faut mettre standalone="no", sinon, on utilise standalone="yes".
  • Chaque balise d'ouverture doit avoir une balise de fermeture. Une balise sans contenu est appelée "empty tag" comme par exemple <flag/>
  • Il ne doit pas y avoir de chevauchement de balise

Ce type de fichier présente de multiples avantages

  • C'est un fichier texte, editable par n'importe quel éditeur de texte (note, wordpad ..).
  • Ce fichier contient des données, mais ne défini pas comment elles doivent être affichées.
  • XML est un format bien connu dont les données peuvent être transférées sous différents formats. Beaucoup d'applications proposent d'enregistrer des données issues d'un format XML ou de sauvegarder dans ce type de format.
  • XML peut être facilement manipulé (lecture de données) par différents analyseurs syntaxique (parser).

Un fichier XML est dit valid s'il est correctement formatté et s'il contient un lien vers un fichier xml shéma associé, lui-même devant être un fichier valide.

Exemple

Ce petit fichier contient une liste de chansons (listepistes) et pour chaque chanson (track) un descriptif (title pour titre , creator pour le lieux de création, location pour accéder au fichier, image s'il existe le chemin d'accés à l'image de la pochette, album pour indiquer le type de musique.
Un fichier XML est en fait une base de données ordonnées au format texte.

Récupération et exploitation des données

Données sous forme de fichiers json

Généralités

JSON (JavaScript Object Notation) est simplement un format trés simple pour le transfer de tout types de données entre deux utilisateurs. A la base c'est un fichier texte contenant des informations spécialement formattées suivant les recommendations JSON.
Ses principaux avantages sont les suivants :

  • C'est un fichier texte donc compréhensible simplement par toutes les plateformes et logiciels,
  • Il permet de transmettre tout types de données (tableau, chaine, entier, objet …),
  • Pour décrire la même chose il est beaucoup moins lourd que XML,
  • Sa syntaxe est simple et le jeu de recommendations trés réduit,
  • Comme il est issue de la notation objet utilisée en javascript, il est complètement intégré à cet environnement.

Elements de syntaxe

  • { } : le contenu entre { } est un objet ou un ensemble d'objets.
  • , : la virgule est utilisée comme séparateur entre attributs.
  • : : séparateur pour associer une valeur ou un tableau à l'attribut.
  • = : séparateur de fonction identique à : mais pour associer une valeur de type texte à l'attribut.
  • [ ] : le contenu entre [ ] est un tableau.

Seulement 5 éléments de syntaxe que l'on peut combiner comme l'on veut pour formater tout type de donnée

Exemples

On va mettre sous forme JSON le fichier XML vu précédemment.

Combinaison 1

Un seul élément comme objet JSON. Les parties rouges sont relatives à la syntaxe JSON, les partie vertes sont des données classiques de type tableau associatif.

Combinaison 2

Plusieurs éléments composent l'objet JSON. Mêmes règles de couleurs que précédemment.

Récupérer un fichier JSON

Récupérer un fichier JSON avec du javascript pur:
  • présence directe du fichier dans la page HTML au même titre qu'un fichier .js de JavaScript,


  • chargement par une commande JavaScript,
    Exp : var xyz = {"nom":"Rambo","age":25,"hobby":["castagne","armes","sport"]};
Récupérer un fichier JSON avec XMLHttpRequest (AJAX)

Lire les données d'un fichier JSON

De manière simple

Reprenons l'exemple var xyz = {"nom":"Rambo","age":25,hobby:["castagne","armes","sport"]}

Aprés transfert via XMLHttpRequest
Avertissement

Dans les applications Web fonctionnant avec XMLHttpRequest, on autorise la communication uniquement dans le même domaine. Ceci constitue un élément de sécurité important, mais toutefois pas infaillible dans le cas de transfer de donnée JSON. Le serveur se doit d'être trés rigoureux dans son codage JSON, ainsi que dans la vérification des contenus, afin de ne pas délivrer du texte JSON invalide ou dangereux (commandes javascript). Pour se prémunir contre celà, il est fortement conseillé d'utiliser un parser (Note1) JSON qui ne reconnait que du texte JSON , rejettant ainsi toutes tentatives de scripts malveillants.

var xyz = JSON.parse('{"nom":"Rambo","age":25,"hobby":["castagne","armes","sport"]}');

Note1 : un parser ou analyseur syntaxique consiste à mettre en évidence la structure d'un texte. La structure révélée par l'analyse donne alors précisément la façon dont les règles de syntaxe sont combinées et appliquées dans le texte.

JSON.parse()

Cette fonction convertit une chaîne JSON en un objet. De plus elle se charge de l'analyse syntaxique du texte.

Syntaxe : var monObjetParse = JSON.parse(text [, reviver])

Si un reviver (paramètre optionnel) est spécifié en tant que fonction on peut effectuer une opération de transformation sur la valeur parsée avant de la renvoyer. Plus précisément, la valeur calculée, et toutes les propriétés (commençant avec les propriétés les plus imbriquées), sont passées individuellement au reviver, qui est appelé avec : l'objet contenant la propriété en cours de traitement, le nom de la propriété en chaine de caractères et la valeur de la propriété. Si la fonction reviver retourne undefined (ou ne retourne aucune valeur, par exemple si l'exécution s'arrête à la fin de la fonction), la propriété est supprimée de l'objet. Autrement la propriété est redéfinie avec la valeur retournée.

Exemple d'utilisation

HTML dans l'objet XMLHTTPREQUEST

La spécification W3C qui à l'origine supportait seulement l'analyse syntaxique XML, et texte supporte aussi maintenant l'analyse syntaxique du HTML, .Cette caractéristique permet aux applications Web d'obtenir une ressource de HTML pour l'analyse syntaxique du DOM.

Limitations Edit To discourage the synchronous use of XMLHttpRequest, HTML support is not available in the synchronous mode. Also, HTML support is only available if the responseType property has been set to "document". This limitation avoids wasting time parsing HTML uselessly when legacy code uses XMLHttpRequest in the default mode to retrieve responseText for text/html resources. Also, this limitation avoids problems with legacy code that assumes that responseXML is null for HTTP error pages (which often have a text/html response body). Usage Edit Retrieving an HTML resource as a DOM using XMLHttpRequest works just like retrieving an XML resource as a DOM using XMLHttpRequest, except you can't use the synchronous mode and you have to explicitly request a document by assigning the string "document" to the responseType property of the XMLHttpRequest object after calling open() but before calling send(). var xhr = new XMLHttpRequest(); xhr.onload = function() { console.log(this.responseXML.title); } xhr.open("GET", "file.html"); xhr.responseType = "document"; xhr.send();

L'interface DOMImplementation

L'object XMLHttpRequest est pratique pour récupérer un peu n'importe quoi comme type de données (text, XML, HTML...), mais à cause de ses contraintes d'utilisation (sécurité), il est parfois nécessaire d'utiliser d'autres méthodes en particulier lorsque l'on fonctionnement en site local.



Respectons la propriété intellectuelle