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/&#126;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, …


(c) Nicolas Bouillon