Communication XML-RPC dans Typo3
De Typo3 CMS / Documentation Typo3 / Support Typo3.
Sommaire |
Le protocole XML-RPC
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.
XML-RPC permet d'appeler une fonction sur un serveur distant à partir de n'importe quel système (Windows, MacOSX, 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 transport des données et la norme XML pour le codage 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.
Principe d'implantation
Le protocole XML-RPC fait donc entrer en communication deux machines. La machine délivrant l'information sera nommée "serveur" tandis que la machine effectuant la demande sera appelée "client". Mettre en place un service XML-RPC nécessite donc la création de deux scripts différents : un script client qui demande l'information à un script serveur.
Librairie typo3 d'implémentation
L'implémentation d'un service XML-RPC sous Typo3 est facilité par l'installation et l'utilisation de l'extension "xmlrpc_lib". Cette librairie implémente les fonctions suivantes :
Fonctions serveurs
function XMLRPC_prepare($data, $type = NULL): permet de générer une structure d'envoi de données passées en paramêtre.
function XMLRPC_response($return_value, $server = NULL) : permet de générer la réponse XMLRPC
function XMLRPC_error($faultCode, $faultString, $server = NULL) : permet de gérer une erreur XMLRPC
function XMLRPC_getMethodName($methodCall) : permet d'appeler une méthode PHP en fonction du paramètre d'appel
function XMLRPC_getParams($methodCall) : permet de récupérer les paramêtres d'appel à une fonction
function XMLRPC_convert_timestamp_to_iso8601($timestamp) : permet de convertir un timestamp en ISO8601
function & XML_serialize($data) : permet de séraliser des données avant de les faire passer dans le flux XML
function & XMLRPC_parse(&$request) : permet de parser la requête pour détecter l'appel à une fonction du protocole XML-RPC
Fonctions clients
function XMLRPC_request($site, $location, $methodName, $params = NULL, $user_agent = NULL) : permet de faire une demande à un serveur XML-RPC
function XMLRPC_convert_iso8601_to_timestamp($iso8601) : permet de reconvertir un timestamp XMLRPC en un timestamp normal
function count_numeric_items($array) : permet de compter le nombre de résultat de la réponse
function & XML_unserialize(&$xml) : permet de désérialiser des données XML-RPC après réception de la réponse
function XMLRPC_show($data, $func = "print_r", $return_str = false) : permet d'afficher la réponse sous forme de tableau PHP.
Exemple d'implémentation
script serveur
Ce script est écrit dans un contexte hors typo3
include_once('/typo3conf/ext/xmlrpc_lib/xmlrpc.php'); //On inclut la librairie xmlrpc.php //Ce tableau contient les correspondances entre la fonction XML-RPC demandée par le client et la fonction PHP a exécutée pour retourner le résultat $xmlrpc_methods = array(); $xmlrpc_methods['sync.getElements'] = 'sync_getElements'; $xmlrpc_methods['method_not_found'] = 'XMLRPC_method_not_found'; $xmlrpc_request = XMLRPC_parse($HTTP_RAW_POST_DATA); //On parse les données de la requête pour voir si une requête XML-RPC a été invoquée $methodName = XMLRPC_getMethodName($xmlrpc_request); //On récupère le nom de la méthode invoquée (sync.getElements dans notre exemple) $params = XMLRPC_getParams($xmlrpc_request); //On récupère les paramètres passés dans la requête if(!isset($xmlrpc_methods[$methodName])){ //Si la méthode invoquée dans la requête n'existe pas on exécute la fonction method_not_found $xmlrpc_methods['method_not_found']($methodName); }else{ $xmlrpc_methods[$methodName]($params); //Sinon on exécute la fonction php correspondante en lui passant les paramètres récupérés. } //Fonction function sync_getElements($params){ $xml['name'] = 'arnaud rousseau'; $xml['societe'] = 'oblady'; $data[] = $xml; XMLRPC_response(XMLRPC_prepare($data)); }
script client
//Appel de la méthode sync.getElements du serveur XML-RPC sans paramêtre $request = XMLRPC_request("montest.dev.oblady.com","/typo3conf/ext/sync_xmlrpc/server.php","sync.getElements",array()); //Affichage des données reçues XMLRPC_show($request);
Le client recevra le message suivant :
Array(2) {
[0]=> string(15) "arnaud rousseau" [1]=> string(6) "oblady"
}
