XML-RPC : des Remote Procedure Calls au format XML
Appeler des fonctionnalités sur des ordinateurs distants au sein d'un réseau ou sur des systèmes distribués (un groupe d’ordinateurs indépendants) à l’aide d’un accès à distance est une pratique courante depuis des décennies. L’idée de base derrière la technologie RPC (Remote Procedure Calls) fut formulée dès 1976 par James E. White dans la requête RFC 707. Par conséquent, ce principe date d’avant le World Wide Web.
En 2015, Google a développé le framework gRPC pour permettre à RPC de satisfaire aux exigences des structures informatiques modernes.
Le protocole XML-RPC est l’une des solutions les plus appréciées pour utiliser des requêtes RPC pratiques à des fins propres. Les appels sont effectués à l’aide du protocole HTTP(S) et de l’Extensible Markup Language (XML). Que recouvre exactement cette spécification, quand est-elle utilisée et comment fonctionne-t-elle exactement ?
Qu’est-ce que XML-RPC ?
XML-RPC (abréviation de « Extensible Markup Language Remote Procedure Call ») est une spécification de protocole pour l’exécution d’appels RPC (appels à distance dans les réseaux d’ordinateurs) ayant recours au protocole réseau sans statut HTTP et au langage de balisage XML (en partie responsable du nom de cette spécification). Le HTTP définit le transfert des données alors que le XML est utilisé pour l’affichage de ces données. Lors de la création de la spécification XML-RPC, une importance toute particulière a été accordée au fait qu’elle puisse être implémentée sans trop d’efforts dans différents langages de programmation et différentes plateformes de systèmes.
Bien que la spécification XML-RPC prévoit exclusivement l’utilisation du protocole HTTP non sécurisé pour le transfert des données, il existe aujourd’hui des variantes largement répandues et acceptées de ce standard qui supportent le protocole HTTPS, un protocole nettement plus sûr mettant en place un chiffrement SSL/TLS.
Développé en 1998, XML-RPC est le fruit d’une étroite collaboration entre le développeur principal Dave Winer, sa société UserLand Software et Microsoft. La multinationale avait en effet décelé le grand potentiel de ce nouveau standard susceptible de favoriser ses propres relations commerciales B2B. Complété par de nouvelles fonctionnalités, XML-RPC s’est ensuite établi comme protocole pour les interfaces destinées aux services Web et s’est vu affubler d’un nouveau nom : SOAP (Simple Object Access Protocol).
Comment fonctionne XML-RPC ?
Les clients souhaitant recourir à XML-RPC utilisent le protocole de transfert HTTP, ou plus précisément la méthode de requête HTTP POST. Après avoir reçu la requête HTTP, le serveur analyse le document XML qui se trouve dans le corps de la requête. À partir de son contenu, il génère ensuite le/les paramètre(s) pour la fonctionnalité souhaitée et l’exécute. Dans le cadre d’une réponse HTTP, le serveur renvoie le résultat au client dans un document XML. XML-RPC supporte les types de données suivants pour la transmission des paramètres ainsi que dans la réponse reçue par un client :
Type de données | Exemple de balise | Description |
---|---|---|
array | <array><data>…</data></array> | Liste pouvant contenir plusieurs valeurs ou types de données |
base64 | <base64>SGFsbG8gV2VsdA==</base64> | Données binaires codées selon la procédure Base64 |
boolean | <boolean>1</boolean> | Variable booléenne (vraie = 1 vs. faux = 0) |
dateTime.iso8601 | <dateTime.iso8601>20200414T16:23:55</dateTime.iso8601> | Date et heure au format ISO-8601 |
double | <double>-0.32653</double> | Nombre flottant avec double précision (64 bits) |
integer | <int>32</int> ou <i4>32</i4> | Integer (nombre entier) |
string | <string>Bonjour à tous !</string> | Chaîne de caractères ; peut contenir zéro octet |
struct | <struct><data>…</data></struct> | Groupe de paires clé/valeur (dans le cas présent, les clés sont des chaînes de caractères et les valeurs peuvent être de n’importe quel type) |
Si plusieurs valeurs ou types de données sont regroupés, la notation XML-RPC offre déjà deux options avec « array » et « struct ». La première option permet de lister les données souhaitées dans l’ordre désiré et « struct » permet de transmettre au serveur les paires clé/valeur préstructurées comme dans l’exemple suivant :
<struct>
<member>
<name>Entrée 1</name>
<value><int>1</int></value>
</member>
<member>
<name>Entrée 2</name>
<value><int>2</int></value>
</member>
</struct>
Certains langages comme Java disposent d’implémentations via XML-RPC et permettent d’indiquer des valeurs nulles. Dans ce cas, le type de données « nil » doit toujours être utilisé dans le document XML bien qu’il ne fasse pas officiellement partie de la spécification XML-RPC et qu’il ne soit pas supporté par tous les serveurs.
Dans quels cas XML-RPC est-il utilisé ?
À l’heure actuelle, XML-RPC ne joue plus de rôle majeur dans la communication de réseau. Après sa publication en 1998, ce format d’échange a rapidement montré son manque de flexibilité, notamment en raison de sa modularité limitée et de son incapacité à transmettre des structures XML propres. Les efforts de conversion élevés qui en résultent ont rendu quasiment indispensable une nouvelle solution qui a été rapidement apportée avec le protocole SOAP déjà évoqué (également développé par l’équipe de Dave Winer en collaboration avec Microsoft).
Néanmoins, il existe aujourd'hui encore des applications Web disposant d’une interface XML-RPC visant par exemple à permettre un échange de données simple avec des services externes. L’Office fédéral allemand des impôts met par exemple à disposition une interface XML-RPC pour la vérification automatisée des numéros d’identification à la TVA étrangers (depuis 2019, via une requête HTTPS). Les systèmes de gestion de contenu tels que WordPress possèdent souvent une interface XML-RPC pour l’échange avec d’autres services Web. Par ailleurs, ce format d’échange constitue la base de la technologie Pingback qui, pendant de nombreuses années, s’est révélée un outil essentiel pour les blogueurs afin de créer des liens. Vous pourrez en apprendre davantage à ce sujet dans l’article « Pingbacks et trackbacks : de quoi s'agit-il ? ».
Exemple de requête serveur simple via XML-RPC
Pour finir, un exemple simple nous permet d’illustrer la communication client-serveur via une interface XML-RPC. Dans ce cadre, la requête HTTP du client ressemble à ce qui suit :
<?xml version="1.0"?>
<methodCall>
<methodName>Teststatut</methodName>
<params>
<param>
<value><i4>10</i4></value>
</param>
</params>
</methodCall>
La fonctionnalité « teststatut » est appelée dans le conteneur « methodCall » et est définie dans le conteneur « methodName ». La fonctionnalité transmet la valeur entière « 10 » comme paramètre.
La réponse du serveur à ce « teststatut » pourrait ressembler à ce qui suit :
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>Statut : OK</string></value>
</param>
</params>
</methodResponse>
Dans cet exemple, la réponse simple du serveur est donc « Statut : OK ».