Représentation et manipulation de données structurées

BE 3 - Client Ajax XML-RPC

Florian CLERC - Gauthier CORNU

Note : Une version en ligne de notre travail est disponible en suivant ce lien. Le compte-rendu qui y est présent n'a rien de plus que cette version, si ce n'est que le lien associé au logo de validation du W3C est cette fois corretement renseigné, et permet d'avoir confirmation, directement sur le site du W3C, que le présent document est valide.

Introduction

Ce dernier BE concernant l'utilisation de XML introduit XML-RPC, un protocole qui s'appuie sur XML pour le packaging des données transportées, et sur le protocole HTTP pour leur transport. Il permet, de manière simple, de formuler des requêtes à un serveur pour solliciter l'utilisation de fonctions réalisées par lui. Nous avons étudié dans le cours les spécifications de ce protocole de service Web ainsi que les usages traditionnels mis en place sur les serveurs pour son utilisation (le côté parfois vague de ces spécifications peut laisser place à l'interprétation). Ici nous n'aurons pas besoin, en utilisant le langage javascript, d'écrire "à la main" l'ensemble de la requête à destination du serveur, mais nous donnerons tout de même un exemple de requête dans ce compte-rendu telle qu'elle est concrètement envoyée et exigée en XML-RPC. Le but général de notre application est de donner la possibilité à l'utilisateur d'obtenir des informations de la part du serveur concernant les départements français, et ce uniquement en utilisant des requêtes XML-RPC et Ajax.

Ecriture d'un client Ajax pour une application Départements

Comme expliqué lors de l'introduction, nous n'aurons pas besoin de formuler nous-mêmes les requêtes complètes pour interroger le serveur (l'utilisation d'ajax et de l'objet XMLHttpRequest en javascript facilitent grandement la tâche). Cependant, pour bien comprendre le fonctionnement de XML-RPC ainsi que celui du service web que nous utilisons, voici l'en-tête de la requête qui est formulée, conforme aux spécifications de XML-RPC :

POST /~muller/cours/xrpc/server/smart-server.php HTTP/1.0
Host: tic01.tic.ec-lyon.fr:80
User-Agent: xmlrpc-client.php
Content-Type: text/xml
Content-Length: 185

Voici ensuite un lien vers le document XML qui contient le corps de la requête (pour des raisons techniques d'interprétation des balises et mauvaise utilisation des sections CDATA de la part de certains navigateurs, nous n'avons pas affiché ce contenu directement dans le corps de notre rapport; cette structure XML se trouve normalement juste après l'en-tête que nous venons de présenter).

On retrouve donc tous les éléments obligatoires d'après les spécifications dans l'en-tête afin de communiquer avec le serveur, et le corps lui-même correspond aux schémas que nous avons vus lors du cours, schémas qui traduisaient du mieux possible les spécifications et l'interprétation qu'on peut en faire (il n'existe en effet pas dans les spécification ni de schéma indiquant de manière claire et définitive la manière dont on doit constituer un tel document). On note l'utilisation de l'élément "string" plutôt que de l'élément "int" pour définir la valeur asssociée au département recherchée...il ne faut en effet pas oublier nos amis les Corses, dont les départements ne sont pas caractérisés par des nombres mais par 2A et 2B.

La page HTML est constituée simplement d’un formulaire et d’une div pour l’affichage des résultats. Le formulaire contient un unique champ permettant à l’utilisateur de rentrer le numéro du département qu’il souhaite rechercher. Un bouton permet de valider ce formulaire. Lorsque l’utilisateur valide le formulaire, une fonction JavaScript capture l’évènement et empêche le formulaire de recharger la page. Ensuite, une expression régulière vérifie que le format de l’entrée utilisateur est valide (c’est-à-dire correspondant à un numéro de département français). Ensuite, une fonction construit le corps de la requête XML et passe ce corps à une fonction sendRequest qui va initialiser l’objet XMLHttpRequest et effectuer ladite requête. Lorsque la requête aboutit, on va parser le résultat XML pour en faire un objet DOM. On va pouvoir extraire les éléments de cette réponse et les afficher dans un tableau construit uniquement par JavaScript. Nous avons également ajouté une image lors du chargement de la réponse (entre le moment où l’utilisateur a validé le formulaire et le moment où la requête aboutit). Parfois, la requête aboutit trop rapidement pour qu’on puisse effectivement voir cette image de chargement. Le résultat final de cette application peut être apprécié en consultant cette page. Le code javascript utilisé est lui disponible à cette page.

Afin de mettre en forme le document qui est reçu de la part du serveur et le contenu XML qui constitue son corps, nous avons voulu mettre en oeuvre une deuxième solution à l'aide de javascript, autre que celle qui utilise les outils de manipulation du DOM. L'utilisation de XSLT nous paraissait une bonne alternative, d'autant que la feuille XSLT en elle-même n'aurait absolument rien de compliqué, se contentant de créer un tableau. Cependant, nous n'avons pas pu l'implémenter en raison de quelques diffcultés techniques que peut poser l'utilisation du langage javascript et les droits dont il dispose en matière d'accès au disque dur du client sur lequel il est exécuté. En effet, afin de lier le document XML que nous souhaitons afficher à une feuille de transformation XSLT, il est nécessaire de pouvoir sauvegarder ce fichier XML sur le disque dur (on ne peut pas, en jvascript, faire appliquer la transformation "à la volée"). Or cela n'est justement pas permis à javascript : ce langage qui s'exécute dans le navigateur n'a pas le droit de stocker des fichiers sur le disque dur de l'utilisateur (et heureusement...on n'imagine pas les conséquences que pourraient avoir le phénomène inverse). Nous sommes donc apparemment condamnés à retourner, déçus et le coeur brisé, vers la première solution que nous avons évoquée et qui, elle, permet la manipulation directe de éléments constituants de la chaîne de caractère contenant le document XML.

Conclusion

L'application que nous venons de réaliser ici montre de manière très simple la façon donc XML-RPC et les technologies sur lesquelles il est basé ouvrent la voie aux services Web. L'utilisation de Javascript et d'Ajax permet tout d'abord d'envoyer des requêtes en direction du serveur que nous souhaitons via l'Internet. Puis, pour que client et serveur se comprennent correctement, un certain formalisme, que nous avons décrit plus haut, doit être employé : c'est le rôle de XML-RPC, basé sur le protocole HTTP (dont nous avons utilisé la version 1.0) et de XML. Les propriétés de XML-RPC font que, si nous avons ici utilisé le langage javascript et un navigateur pour l'exécuter, le même résultat aurait pu être obtenu dans n'importe quel langage et sur n'importe quel système d'exploitation, pourvu qu'un accès au réseau soit disponible (et que le serveur réponde présent). Comme nous l'avons déjà dit, l'utilisation de XML-RPC est très simple et fait parfois preuve de certaines limitations (il ne gère par exemple pas les espaces de noms). S'il est toujours utilisé, un autre protocole basé sur XML lui a succédé : SOAP.

Valid XHTML 1.0 Strict