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>.
<?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>
Exemple [voir]
<?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>';
?> |