SOAP avec PHP et Python
Introduction
De manière simplifiée, SOAP permet de faire de l'appel de procédure à distance au dessus du protocole HTTP. Les données échangées sont au format XML.
Serveur PHP
Avec PHP 5
Il va utiliser l'extension SOAP fournie avec PHP5, et il va répondre aux requêtes. Le code est alors très simple, que j'enregistre dans un fichier simple_soap.php :
<?php
//Définition des fonctions. Cela pourrait être dans un autre fichier inclus.
function bonjour($nom)
{
return "Bonjour " . $nom . " !";
}
function additionner($a, $b)
{
return $a + $b;
}
//Création du serveur
$server = new SoapServer(null, array('uri'=>'http://localhost/~bouil/simple_soap/simple_soap.php', 'encoding'=>'UTF-8'));
$server->addFunction("bonjour");
$server->addFunction("additionner");
//Et on lance le service en attente des données du client.
$server->handle();
?>
Et c'est tout. On déclare les fonctions, on crée un nouveau serveur, on liste les fonctions à mettre à disposition, et on lance enfin le service.
Avec PHP 4
Pour PHP4, on peut utiliser NuSoap.
Le code est alors légèrement différent. À noter que l'utilisation de NuSoap est incompatible avec PHP5, à cause de collision dans le nom des classes avec les classes SOAP déjà fournies.
<?php
require_once('nusoap.php');
//Définition des fonctions. Cela pourrait être dans un autre fichier inclus.
function bonjour($nom)
{
return "Bonjour " . $nom . " !";
}
function additionner($a, $b)
{
return $a + $b;
}
//Création du serveur
$server = new soap_server;
$server->soap_defencoding = "UTF-8";
$server->decode_utf8= false;
$server->register('bonjour');
$server->register('additionner');
//Et on lance le service en attente des données du client.
$server->service($HTTP_RAW_POST_DATA);
?>
Client Python
Code
Python va utiliser le module python-soappy, disponible dans votre distribution.
Une fois encore, le code du fichier simple_soap.py est simple :
#!/usr/bin/env python
# -- coding: utf-8 --
import SOAPpy
# création du client SOAP
clientSOAP = SOAPpy.SOAPProxy("http://localhost/~bouil/simple_soap/simple_soap.php")
clientSOAP.config.dict_encoding = "utf8"
clientSOAP.config.debug = 0
clientSOAP.config.dumpSOAPIn = 0
clientSOAP.config.dumpSOAPOut = 0
# exécution des fonctions distantes
print clientSOAP.bonjour(u"Bouil")
x = 7
y = 35
res = clientSOAP.additionner(7, 35)
print "%s + %s = %s" % (x, y, res)
Les lignes concernant le débogage (clientSOAP.config.debug = 0) ou l'affichage des données SOAP envoyées ou reçues (clientSOAP.config.dumpSOAPIn = 0 et clientSOAP.config.dumpSOAPOut = 0) sont bien utiles quand quelque chose va de travers. Il suffit alors de mettre les valeurs à 1.
Exécution
Et voilà, cela donne bien sur l'effet attendu :
$ ./simple_soap.py Bonjour Bouil ! 7 + 35 = 42
Conclusion
J'ai fait ici l'impasse sur les aspects plus complexes de SOAP, puisque ce n'était pas ce dont j'avais besoin lorsque j'ai cherché à utilser ces choses là.
L'aspect interessant de SOAP, ici servi par PHP, c'est de pouvoir alors fournir les mêmes services, à partir d'une interface Web ou depuis un client dit "lourd" sur le bureau, par exemple en PyGTK, PyQT, …