TUTORIELS 
Description d'un client XML-RPC en Php
XML-RPC est une technologie qui permet à plusieurs applications issues de différents systèmes et langages, de communiquer entre elles. Une technologie à la base des Web Services par exemple.  (9 janvier 2002)
 

Pages 1 | 2

Issue de la société "Userland Software" (Avril 1998), la technologie XML-RPC repose, comme son nom l'indique, sur XML (Extensible Markup Language) et sur le protocole RPC (Remote Procedure Calling). Tandis qu'XML apporte l'indépendance vis à vis de la plate-forme d'exécution, RPC apporte la possibilité d'effectuer "des appels de procédure" via internet.

Grâce à l'utilisation de la technologie XML-RPC, il est ainsi possible à différentes applications de dialoguer entre elles sans se soucier des systèmes sur lesquelles elles fonctionnent, ni même du langage dans lequel elles ont été écrites.

En effet il existe de nombreuses implémentations de cette technologie : Php mais aussi Perl, Python, C / C++, Java, .Net, Ruby, Rebol, Cold Fusion... La liste est longue.
Si une implémentation en particulier vous intéresse, vous pouvez consulter ce "how-to" ou cette liste.

Si vous souhaitez en savoir plus sur les RPC (entre autres), ce qui n'est pas le sujet de ce tutoriel, consultez ce texte, "xmlRpcForNewbies" qui malgré un titre un peu péjoratif n'en constitue pas moins une bonne source d'informations pour dépoussiérer ou mettre à jour ses connaissances.

L'objet de ce tutoriel est de comprendre de quoi est constitué un client XML-RPC écrit en Php : les étapes et les fonctions nécessaires à l'établissement d'une connexion puis le rappatriement des données à partir du serveur.


XML-RPC : un dialogue client / serveur

Oui, nous allons "disséquer" le code d'un client Php, mais pour nous connecter sur quel serveur ? Bonne question.
Le client en question que nous allons étudier contient l'adresse d'un serveur de test élégamment mis à notre disposition par sourceforge.net. Nous pourrons ainsi focaliser notre attention sur le code du client. Celui-ci est construit sur la librairie initiallement développée par Edd Dumbill (Useful Information Company) avant d'être, depuis sa version 1.0, ouverte à un développement plus collectif via SourceForge.

Pourquoi utiliser une librairie alors que Php 4.1 propose désormais par défaut des fonctions XML-RPC ? D'une part parce que celle-ci est écrite en C, elle offre donc de bonnes performances, et d'autre part (cf le lien précédent), le site php.net prévient l'utilisateur potentiel de ces fonctions que celles-ci peuvent à tout moment changer de nom, on peut lire : "Be warned and use this extension at your own risk".
Au regard de cette recommandation, il est bien évidemment déconseillé de les utiliser en production. Enfin à l'heure où sont écrites ces lignes, les hébergeurs proposant Php 4.1 ne sont pas encore légion.

Cette librairie va grandement nous faciliter le travail. Il suffit par la suite de connaître les différents mécanismes et échanges nécessaires au dialogue du client avec le serveur pour rappatrier et exploiter les résultats transmis par le serveur. N'oublions pas bien sûr la documentation de l'API qui nous renseignera sur les différentes méthodes disponibles.

Puisque le serveur est fourni, voici ce qu'il nous reste à faire :
- Créer un objet "client", c'est l'initialisation du client
- Créer un message à destination du serveur
- Envoyer celui-ci
- Le réceptionner (vérifier les codes retour) puis exploiter le résultat obtenu.

Ces différentes étapes nécessitent de connaître un minimum la syntaxe permettant de manipuler des classes en Php. Ce tutoriel indique comment s'y prendre.


Première étape : initialisation du client

Voici tout d'abord le lien qui pointe vers la documentation de cette librairie ainsi que vers la librairie elle-même (raccourci).

Nous voulons initialiser notre client, nous allons donc tout naturellement utiliser la classe prévue à cet effet : "xmlrpc_client".
La documentation est claire, voici la syntaxe pour créer notre objet client :

$client=new xmlrpc_client($server_path, $server_hostname, $server_port);

De la version du client Php que nous étudions (rappel), nous tirons les valeurs suivantes :

$server_path : 'api/sample.php'
$server_hostname : xmlrpc-c.sourceforge.net''
$server_port : 80

Plus précisemment, nous avons tiré ces informations de la ligne suivante :

$client = new xmlrpc_client('/api/sample.php', 'xmlrpc-c.sourceforge.net', 80);

(Note : le code source étudié initialise le client en nommant un objet "$server", il est à notre avis plus intuitif d'utiliser "$client" dans ce cas)

Nous savons donc désormais à quoi correspondent les trois paramètres de cette classe. Le premier paramètre est donc le chemin du script qui va gérer la requête XML-RPC, le second paramètre est le nom (ou l'IP) du serveur, quant au troisième (facultatif) il représente le port sur lequel nous nous connectons (80 par défaut).

Au niveau des méthodes fournies par cette classe, on trouve :

- send() : son nom est suffisamment explicite, nous l'utiliserons à la prochaine étape
- setCredentials : Transporte le login / password à des fins d'authentification HTTP
- setCertificate : Permet d'employer HTTPS. Attention, dans ce cas Php doit être compilé avec l'extension "curl". De plus, php 4.0.2 au moins est nécessaire pour faire fonctionner HTTPS, à noter également qu'un bug de la version 4.0.6 empêche son utilisation.
- setDebug : Très utile pour obtenir des informations retournées par le serveur, nous testerons.

Deuxième étape : construction de la requête

Cette étape repose sur l'utilisation de la classe "xmlrpcmsg" dont voici la syntaxe :

$message=new xmlrpcmsg($methodName, $parameterArray);

Là encore c'est le code source de notre client qui va nous indiquer la valeur des paramètres.

$methodName : 'sample.sumAndDifference'

sumAndDifference est le nom de la méthode que nous allons appeler. Celle-ci permet dans un premier temps d'ajouter deux nombres entre eux, puis dans un deuxième temps, de les soustraire.

La technologie XML-RPC permet de manipuler 8 types de données :

- int
- double
- string
- boolean
- base64
- dateTime.iso8601
- array
- struct

Nous ne sommes pas obligés d'indiquer les paramètres éventuels d'une méthode lors de la déclaration de l'objet, il est possible de le faire ultérieurement en utilisant la méthode "addParam()" après la création de celui-ci.

Nous décidons de passer néanmoins les paramètres de la méthode (sumAndDifference) lors de la création de l'objet. Peu importe le moment où nous le faisons, il faut de toute façon avoir recours à la classe "xmlrpcval" afin d'encapsuler nos données dans un format compréhensible par toutes les autres classes de la librairie.

Voici trois exemples issus de la documentation de cette classe qui permettent de comprendre comment utiliser nos paramètres :

(Note : La documentation indique "xmlrpcvalue", c'est une faute de frappe)
$myInt=new xmlrpcval(1267, "int");
$myString=new xmlrpcval("Hello, World!", "string");
$myBool=new xmlrpcval(1, "boolean");

Fort de ces exemples, et des précédents paragraphes, nous résumons donc la syntaxe de la déclaration de notre message :

(Note : tient normalement sur une ligne complète)
$message = new xmlrpcmsg('sample.sumAndDifference',
                        array(new xmlrpcval(5, 'int'), new xmlrpcval(3, 'int')));

Pages 1 | 2

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page