Spécification XML-RPC

Mardi, 15 Juin 1999, by Dave Winer. Traduction : Jean-Christophe Charvy.

Version originale : http://www.xml-rpc.com/spec

Mise à jour le 30/06/03 DW

Mise à jour le 16/10/99 DW

Mise à jour le 21/01/99 DW

Cette spécification documente le protocole XML-RPC implémenté dans UserLand Frontier 5.1.

Pour une explication non-technique, se référer à XML-RPC for Newbies.

Cette page fournit toute l'information dont un développeur a besoin.

Généralités

XML-RPC est un protocole d'Appel de Procédure à Distance (Remote Procedure Calling) qui fonctionne sur Internet.

Un message XML-RPC est une requête HTTP POST. Le corps de la requête est en XML. Une procédure s'exécute sur le serveur, et la valeur qu'elle retourne est également formatée en XML.

Les paramètres d'une procédure peuvent être des scalaires, des numériques, des chaînes de caractères, des dates, ... etc. Ils peuvent également des structures complexes de listes et d'enregistrements.

Exemple de requête

Voici un exemple de requête XML-RPC :

POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

<?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>

Caractéristiques de l'entête HTTP

Le format de l'URI sur la première ligne de l'entête n'est pas spécifié. Par exemple, il peut être omis, ou ce peut être un unique slash, si le serveur reçoit uniquement des appels XML-RPC. Cependant, si le serveur prend en charge diverses requêtes HTTP qui arrivent, il est permis que l'URI aide à diriger la requête vers le code qui traite les requêtes XML-RPC. (Dans l'exemple, l'URI est /RPC2, indiquant au serveur de diriger la requête vers le service "RPC2".)

Le client (User-Agent) et l'hôte (Host) doivent être spécifiés.

Le type de contenu (Content-Type) est text/xml.

La taille du contenu (Content-Length) doit être spécifiée et doit être exacte.

Format du corps du message

Le corps de la requête est en XML, il s'agit d'une unique structure <methodCall>.

La structure <methodCall> doit contenir un sous-élément <methodName>, il s'agit d'une chaîne de caractère, qui contient le nom de la méthode qui doit être appelée. La chaîne de caractère ne peut contenir que des caractères non-symboliques : des lettres de A à Z, en majuscules ou en minucules, des chiffres de 0 à 9, l'espace souligné (underscore), le point, les deux points et le slash. Il revient intégralement au serveur de décider comment interpréter les caractères dans une clause methodName.

Par exemple, la valeur de <methodName> peut être le nom d'un fichier contenant un script inoqué quand une requête arrive. Cela peut être le nom d'un champ dans une table d'une base de données. Ou bien cela peut être le chemin d'accès à un fichier à travers une arborescence de répertoires.

Si l'appel de la procédure comporte des paramètres, la structure <methodCall> doit contenir un sous-élément <params>. Le sous-élément <params> peut contenir n'importe quel nombre de sous-éléments <param>, chacun ayant une clause <value>.

Clauses <value> scalaires

Les clauses <value> peuvent être scalaires, le type est indiqué en insérant dans la valeur, une des balises listées ci-dessous :

TagTypeExample
<i4> or <int>entier (signé sur 4 octets)-12
<boolean>0 (faux, false) ou 1 (vrai, true)1
<string>chaine de caractèresbonjour à tous
<double>nombre signé à virgule flottante, double précision-12.214
<dateTime.iso8601>date / heure19980717T14:08:55
<base64>binaire base64eW91IGNhbid0IHJlYWQgdGhpcyE=

Si aucun type n'est indiqué, le type est string.

Structures <struct>

Une valeur peut également être du type <struct>.

Une structure <struct> contient des sous-éléments <member> et chaque sous-élément <member> contient une clause <name> et une clause <value>.

Voici un exemple de structure <struct> à deux éléments :

<struct>
   <member>
      <name>lowerBound</name>
      <value><i4>18</i4></value>
   </member>
   <member>
      <name>upperBound</name>
      <value><i4>139</i4></value>
   </member>
</struct>

Les structures <struct> peuvent être récursives, n'importe quelle clause <value> peut contenir une structure <struct> ou n'importe quel autre type, y compris une structure <array>, décrite ci-dessous.

Structures <array>

Une valeur peut également être du type <array>.

Une structure <array> contient un unique élément <data>, qui peut contenir n'importe quel nombre de clauses <value>s.

Voici un exemple de structure <array> à quatre éléments :

<array>
   <data>
      <value><i4>12</i4></value>
      <value><string>Egypt</string></value>
      <value><boolean>0</boolean></value>
      <value><i4>-31</i4></value>
   </data>
</array>

Les éléments des clauses <array> n'ont pas de noms.

Vous pouvez mélanger les types comme le montre l'exemple ci-dessus.

Les structures <arrays> peuvent être récursives, n'importe quelle clause <value> peut contenir une structure <array> ou n'importe quel autre type, y compris une structure <struct>, décrite plus haut.

Un exemple de réponse

Voici un exemple de réponse à une requête XML-RPC :

HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT

<?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse>

Format de réponse

Même si il y a une erreur de bas niveau, le retour est toujours 200 OK.

Le type de contenu (Content-Type) est text/xml. La taille du contenu (Content-Length) doit être spécifiée et doit être exacte.

> Le corps de la réponse est une simple struture XML, il s'agit d'une structure <methodResponse>, qui peut contenir une seule clause <params> qui contient une seule clause <param> qui contient une seule clause <value>.

La structure <methodResponse> peut également contenir une clause <fault> qui contient une clause <value> qui contient une structure <struct> comportant deux éléments, l'un nommé <faultCode> et qui est un entier (<int>) et l'autre nommé <faultString>, et qui est une chaîne de caractères (<string>).

Une structure <methodResponse> ne peut contenir à la fois une clause <fault> et une clause <params>.

Exemple de clause <fault>

HTTP/1.1 200 OK
Connection: close
Content-Length: 426
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:02 GMT
Server: UserLand Frontier/5.1.2-WinNT

<?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name>faultCode</name> <value><int>4</int></value> </member> <member> <name>faultString</name> <value><string>Too many parameters.</string></value> </member> </struct> </value> </fault> </methodResponse>

Stratégies et objectifs

Pare-feus/Firewalls. L'objectif de ce protocole est d'établir une base compatible à travers différents environnements, il n'y a aucun gain au-delà des possibilités de l'interface des CGI. Un pare-feu peut surveiller les requêtes POST dont le Content-Type est text/xml.

Facilité d'apprentissage. Nous avons souhaité un format clair et extensible qui serait extrêmement simple. Il doit être possible pour un développeur HTML d'être en mesure d'ouvrir un fichier qui contient l'appel à une procédure XML-RPC, et de comprendre ce que cela fait, d'être capable de le modifier et que cela fonctionne à la première ou à la deuxième tentative.

Facilité d'implémentation. Nous avons également voulu que ce soit un protocole facile à implémenter, qui pourrait rapidement être adapté pour fonctionner dans d'autres environnements ou sur d'autres systèmes d'exploitation.

Mise à jour du 21 janvier 1999

Les questions suivantes ont été posées sur le groupe de discussion UserLand alors que XML-RPC était implémenté en Python.

Suppléments

Mise à jour le 30/06/03 DW

Suppression de "ASCII" de la définition de "string".

Changement des dates de copyright, ci-dessous, de 1999-2003 à 1998-99.

Copyright and disclaimer

© Copyright 1998-2003 UserLand Software. All Rights Reserved.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and these paragraphs are included on all such copies and derivative works.

This document may not be modified in any way, such as by removing the copyright notice or references to UserLand or other organizations. Further, while these copyright restrictions apply to the written XML-RPC specification, no claim of ownership is made by UserLand to the protocol it describes. Any party may, for commercial or non-commercial purposes, implement this protocol without royalty or license fee to UserLand. The limited permissions granted herein are perpetual and will not be revoked by UserLand or its successors or assigns.

This document and the information contained herein is provided on an "AS IS" basis and USERLAND DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.