XML-RPC est un protocole RPC (remote procedure call), une spécification simple et un ensemble de codes qui permettent à des processus s'exécutant dans des environnements différents de faire des appels de méthodes à travers un réseau.
Ce protocole a été élaboré et publié dans sa première version en 1998 par Dave Winer, travaillant pour UserLand Software[1], en collaboration avec Microsoft[2].
XML-RPC permet d'appeler une fonction sur un serveur distant à partir de n'importe quel système (Windows, Mac OS X, GNU/Linux) et avec n'importe quel langage de programmation. Le serveur est lui-même sur n'importe quel système et est programmé dans n'importe quel langage.
Cela permet de fournir un service web utilisable par tout le monde sans restriction de système ou de langage.
Les processus d'invocation à distance utilisent le protocole HTTP pour le transfert des données et la norme XML pour la structuration des données.
XML-RPC est conçu pour permettre à des structures de données complexes d'être transmises, exécutées et renvoyées très facilement.
XML-RPC est une alternative aux services web WS-*, dont SOAP.
Pour effectuer un appel XML-RPC, un client doit effectuer une requête POST de type text/xml avec un corps qui précise la méthode distante invoquée, et, s'il y en a, les paramètres à passer à cette méthode.
Le serveur XML-RPC doit renvoyer une réponse avec le code "200 OK", le type text/xml, et un corps qui peut contenir un unique paramètre. En cas d'erreur le corps peut à la place contenir une description de l'erreur. Une erreur est représentée par un code d'erreur sous forme d'un entier, et d'un message d'erreur sous forme de chaîne de caractères.
Imaginons un serveur xml-rpc qui comporterait une méthode genereUnMessageDeSalutation qui prend comme paramètre un nom et qui retour un message de salutation en conséquence. Une requête pour invoquer cette méthode aurait le corps
<?xml version="1.0"?>
<methodCall>
<methodName>genereUnMessageDeSalutation</methodName>
<params>
<param>
<value><string>Paul</string></value>
</param>
</params>
</methodCall>
et la réponse ressemblerait à
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>Bonjour Paul</string></value>
</param>
</params>
</methodResponse>
Les types de données qui existent dans la spécification xml-rpc sont :
Nom | Exemple | Commentaire |
---|---|---|
Entier | <i4>-666</i4>
<int>-666</int>
|
Entier signé sur 4 bytes |
Booléen | <boolean>0</boolean>
<boolean>1</boolean>
|
0 représente l'état "faux", 1 représente l'état "vrai" |
Chaîne de caractères | <string>Toto</string>
|
|
Nombre à virgule | <double>-13.12</double>
|
double signé |
Date et heure | <dateTime.iso8601>2025-04-13T20:06:52</dateTime.iso8601>
|
Date et heure au format ISO 8601 |
Données binaires | <base64>dW4gdGV4dGUgc2FucyBpbnTDqXLDqnQ=</base64>
|
Donées binaires encodées en base64 |
Structure de données | <struct>
<member>
<name>nom</name>
<value><string>Toto</string></value>
</member>
<member>
<name>age</name>
<value><i4>18</i4></value>
</member>
</struct>
|
Chaque membre de la structure de données a un nom et une valeur.
Un membre peut être de n'importe quel type. Il peut aussi être lui même une structure de données |
Tableau | <array>
<data>
<value><string>Toto</string></value>
<value><i4>18</i4></value>
</data>
</array>
|
Les types de valeur du tableau peuvent de n'importe quel type et peuvent être hétérogènes |
Une extension de la spécification introduit le type de données <nil /> qui permet de représenter une absence de valeur[4]. Il n'est toutefois pas garanti qu'un serveur XML-RPC accepte ce type de données sur tous ses champs.
Par ailleurs, bien que ne faisant pas partie de la spécification, certaines implémentations acceptent le type de données <i8> pour représenter les entiers signés codés sur 8 bytes[5],[6].
Des critiques à l'encontre de XLM-RPC font valoir qu'il n'a qu'une faible valeur ajoutée par rapport à du simple XML ou par rapport à une API Rest. Notamment une requête XML-RPC est environ 4 fois plus grosse qu'une requête en simple XML qui encoderait les mêmes objets[7],[8],[9].