Le protocole XML-RPC est un standard pour le traitement distribué sur Internet. L'appel de procédure à distance (RPC) est un mécanisme de lancement de procédures pouvant être présentes sur différents serveurs et être programmées dans divers langages de programmation.
Un message XML-RPC est une requête HTTP-POST dont le corps est écrit en XML. Une procédure s'exécute sur le serveur et la valeur retournée est également formatée en XML.
POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: leprogrammeurweb.com Content-Type: text/xml Content-length: 182 <?xml version="1.0"?> <methodCall> <methodName>methode.action</methodName> <params> <param> <value><i4>1010</i4></value> </param> </params> </methodCall>
Les paramètres des messages XML-RPC acceptent six types de données différents.
Balise | Type de données | Exemple |
---|---|---|
<i4><int> | Nombre entier signé sur 4 octets. | 780, -23 |
<boolean> | Valeur booléenne. | 0 (false), 1 (true) |
<string> | Chaîne de caractères ASCII. | 'Bienvenue' |
<double> | Nombre à virgule flottante en double précision et signé. | 0.129657835, -89.40325 |
<dateTime.iso8601> | Expression temporelle au format ISO-8601. | 20020228T20:51:06 |
<base64> | Données binaire encodées en base 64. | kf95WNb01Pht6245jHIjmp21hz1 |
Les valeurs repérées par le balisage <value> peuvent être non seulement une valeur d'un type précité, mais aussi une structure <struct> ou encore un tableau de données <array>.
<struct> <member> <name>lowerBound</name> <value><i4>18</i4></value> </member> <member> <name>upperBound</name> <value><i4>139</i4></value> </member> </struct> <array> <data> <value><i4>12</i4></value> <value><string>Egypt</string></value> <value><boolean>0</boolean></value> <value><i4>-31</i4></value> </data> </array>
La réponse à la requête est obtenue par le biais d'un message spécifique comportant la balise <methodResponse>.
HTTP/1.1 200 OK Connection: close Content-Length: 163 Content-Type: text/xml Date: Fri, 18 Apr 2002 16:09:54 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodResponse> <params> <param> <value><double>215.50</double></value> </param> </params> </methodResponse>
Si une erreur est rencontrée, alors une balisage spécial sera renvoyé avec pour valeur le code (faultCode) et le message (faultString) de l'erreur dans une structure <struct>.
Exemple [voir]<?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name>faultCode</name> <value><int>1</int></value> </member> <member> <name>faultString</name> <value><string>Unknown method.</string></value> </member> </struct> </value> </fault> </methodResponse>
<?php /* Fichier 'page_procedure.php' sur le serveur 'leprogrammeurweb.com'. */ include("xmlrpc.inc"); include("xmlrpcs.inc"); function obtenir_reponse($parametres) { global $xmlrpc_erreur; $premiere_valeur = $parametres->params[0]; $valeur_scalaire = $premiere_valeur->scalarval(); $retour = $valeur_scalaire * 20; return new xmlrpcresp(new xmlrpcval($retour, "int")); } $serveur = new xmlrpc_server( array("calcul" => array("function" => "obtenir_reponse"))); ?> <?php // fichier disponible chez le client. include("xmlrpc.inc"); if($HTTP_POST_VARS["nombre"]!="") { $message = new xmlrpcmsg('calcul', array(new xmlrpcval($HTTP_POST_VARS["nombre"], "int"))); $client = new xmlrpc_client("page_procedure.php", " leprogrammeurweb.com", 80); $client->setDebug(0); $reponse = $client->send($message); $valeur = $reponse->value(); if(!$reponse->faultCode()) { echo "<p>Le nombre ". $HTTP_POST_VARS["nombre"] . " est " . $valeur->scalarval() . "</p>" . "<p>Cette valeur a été obtenue en retour</p><b>" . htmlentities($reponse->serialize()). "</b>"; } else { echo "<u>Faute: </u><p>" . "Code: " . $reponse->faultCode() . "<br>Message : " . $reponse->faultString() . "</p>"; } } echo '<h4>Saisissez un nombre :</h4>' . '<form method="POST">' . '<input type="text" size="5" value="' . ${nombre} . '"><br>' . '<input type="submit" value="Envoyer" name="submit">' . '</form>'; ?> |