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

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)