Service Web avec PHP5 et SOAP
Un article de Wiki SOS-ADMIN.
Ce guide vous est proposé par SD-France.com
Sommaire |
Pourquoi ce guide ?
Je créer cette page car je me rends compte que créer un service web avec PHP5/SOAP n'est pas clairement documenté quelque part (en français en tout cas...), je ne prétends pas faire mieux que ce que j'ai pu trouver moi même, mais j'espère que ma façon d'agir, et d'expliquer (en français notemment), vous permettra de mieux comprendre le fonctionnement et la mise en place d'un serveur SOAP avec PHP5.
Bien sûr, comme la plupart des domaines de programmation, ce n'est pas compliqué au final, mais bon... si personne ne te montre le chemin, tu sais pas lequel prendre :)
Pré-requis
Vous devez disposer de d'un serveur web + PHP5 en module ou bien en CGI, avec, au minimum, les options suivantes :
--enable-libxml --enable-soap
Préparation
Cahier des charges
Afin de créer un service le plus clair qui soit, vous devez faire un de cahier des charges auquel votre Service Web devra répondre, voici ce qui à été rédigé dans mon cas :
- Nom du Service Web : MxProtect
- Rôle du service Web : Le service web sera en fait l'interface de gestion de la quarantaine des spams qui auront été filtrés par les serveurs mails de MxProtect, en bref, pour expliquer le déroulement, un serveur mail va détecter un spam et appeller la fonction MxProtectQueueSpam pour lui déleguer la gestion de ce dernier, le mail sera alors géré par ...
- Fonctions du Service Web :
- MxProtectQueueSpam :
- Rôle : Permet de mettre un mail en quarantaire
- Arguments :
- From type string => Expéditeur du mail
- To type string => Destinataire du mail
- Subject type string => Sujet du mail
- Date type int => Date du mail (timestamp)
- Message type string => Mail lui-même (source complète : header + corps)
- Valeur de retour :
- type int
- MxProtectQueueSpam :
Descrition du service : WSDL
Afin d'assurer l'intéroperabilité du Service Web, nous allons mettre en place une description de ce dernier, pour cela, une norme à évidement été mis en place : WSDL
Notre but n'étant pas de vous apprendre la norme WSDL, nous essayerons de vous faire apprendre par l'exemple, et nous nous tiendrons à dire que WSDL repose sur la norme XML
Allons-y, voici notre WSDL vide, avec uniquement son squelette :
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='MxProtect'
targetNamespace='http://example.org/MxProtect'
xmlns:tns=' http://example.org/MxProtect '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<portType name='MxProtectPortType'>
</portType>
<binding name='MxProtectBinding' type='tns:MxProtectPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
</binding>
<service name='MxProtectService'>
<port name='MxProtectPort' binding='MxProtectBinding'>
<soap:address location='http://XXX.XXX.XXX.XXX/MxProtect.php5'/>
</port>
</service>
</definitions>
Maintenant nous allons décrire notre fonction MxProtectQueueSpam, pour cela, nous allons commencer par rajouter le bloc ci-dessous juste avant </binding> :
<operation name='MxProtectQueueSpam'>
<soap:operation soapAction='urn:MxProtectQueueSpam'/>
<input>
<soap:body use='encoded' namespace='urn:MxProtect'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:MxProtect'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
et nous allons aussi ajouter le bloc ci-dessous avant </portType> :
<operation name='MxProtectQueueSpam'>
<input message='tns:MxProtectQueueSpamRequest'/>
<output message='tns:MxProtectQueueSpamResponse'/>
</operation>
pour finir, on ajoute ceci avant <portType ...
<message name='MxProtectQueueSpamRequest'> <part name='From' type='xsd:string'/> <part name='To' type='xsd:string'/> <part name='Subject' type='xsd:string'/> <part name='Date' type='xsd:int'/> <part name='Message' type='xsd:string'/> </message> <message name='MxProtectQueueSpamResponse'> <part name='Result' type='xsd:int'/> </message>
on obtiens donc notre MxProtect.wsdl :
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='MxProtect'
targetNamespace='http://example.org/MxProtect'
xmlns:tns=' http://example.org/MxProtect '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<message name='MxProtectQueueSpamRequest'>
<part name='From' type='xsd:string'/>
<part name='To' type='xsd:string'/>
<part name='Subject' type='xsd:string'/>
<part name='Date' type='xsd:int'/>
<part name='Message' type='xsd:string'/>
</message>
<message name='MxProtectQueueSpamResponse'>
<part name='Result' type='xsd:int'/>
</message>
<portType name='MxProtectPortType'>
<operation name='MxProtectQueueSpam'>
<input message='tns:MxProtectQueueSpamRequest'/>
<output message='tns:MxProtectQueueSpamResponse'/>
</operation>
</portType>
<binding name='MxProtectBinding' type='tns:MxProtectPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='MxProtectQueueSpam'>
<soap:operation soapAction='urn:MxProtectQueueSpam'/>
<input>
<soap:body use='encoded' namespace='urn:MxProtect'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:MxProtect'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<service name='MxProtectService'>
<port name='MxProtectPort' binding='MxProtectBinding'>
<soap:address location='http://XXX.XXX.XXX.XXX/MxProtect.php5'/>
</port>
</service>
</definitions>
Application PHP5/SOAP
Voilà, nous rentrons dans la deuxième grosse partie (la première étant WSDL).
J'insiste sur le fait, qu'ici, nous ne sommes pas là pour apprendre à programmer en PHP, mais l'utiliser pour créer un Service Web grâce à SOAP.
Serveur
Simple et clair :
<?php
function MxProtectQueueSpam($From, $To, $Subject, $Date, $Message)
{
// Retourne un entier (int)
return 23;
}
ini_set("soap.wsdl_cache_enabled", "0"); // desactive le cache WSDL
$server = new SoapServer('MxProtect.wsdl');
$server->addFunction('MxProtectQueueSpam');
$server->handle();
?>
on pourra tester ce dernier avec le client SOAP :)
Client
Code source (MxProtect.client.php5):
<?php
// Une fois que votre le dev est termine, pensez a re-activer le cache
// en supprimant ou en commantant cette ligne
ini_set("soap.wsdl_cache_enabled", "0"); // desactive le cache WSDL
$client = new SoapClient('MxProtect.wsdl'));
echo $client->MxProtectQueueSpam('from@example.org',
'to@example.net',
'Example mail',
time(),
"From: from@example.org\nTo: to@example.net\nSubject: Example mail\n\nbody of my example\n\nDaviXX\n"
);
?>
Test
Espérons que cela fonctionne :
davixx@davixx ~ $ telnet XXX.XXX.XXX.XXX 80 Trying XXX.XXX.XXX.XXX... Connected to XXX.XXX.XXX.XXX. Escape character is '^]'. GET /MxProtect.client.php5 HTTP/1.0 HTTP/1.1 200 OK Date: Thu, 15 Dec 2005 12:39:32 GMT Server: Apache/1.3.34 (Unix) PHP/5.1.0 X-Powered-By: PHP/5.1.0 Connection: close Content-Type: text/html 23Connection closed by foreign host.
Ca roule...
Bon ben plus qu'une chose à dire, utilisez PHP5/SOAP !!! :)
Liens utiles
http://www.zend.com/php5/articles/php5-SOAP.php
http://www.linuxmag-france.org/produit.php?produit=405
http://classes.scriptsphp.org/article.Construire-un-service-web-en-php-5
Vos commentaires
Merci d'ajouter vos commentaires à la page de discussion... Discuter:Service_Web_avec_PHP5_et_SOAP
Credits
--DaviXX 25 déc 2005 à 15:32 (CET)

