SOAP avec PHP et Python
Introduction
Ce document présente la création d'une application triviale mettant en œuvre un serveur SOAP d'un coté en PHP, et un client SOAP en Python de l'autre. L'application va simplement demander au serveur de dire bonjour et de faire une addition.
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
# -<strong class="bold">- coding: utf-8 -</strong>-
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, …