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>';
?>
Sommaire