Langage de programmation PHP
Chapitre 1. Introduction
Chapitre 2. Variables, opérateurs et expressions
Chapitre 3. Instructions de contrôle
Chapitre 4. Tableaux
Chapitre 5. Entrées/Sorties
Chapitre 6. Réutilisation de code
Chapitre 7. Lecture/écriture de fichiers
Chapitre 8. Fonctions diverses
Chapitre 9. Sérialisation
Chapitre 10. Fonctions orientées réseau
Chapitre 11. Base de données
Chapitre 12. Manipulations d’images
Chapitre 13. Programmation objet : PHP et les classes ( PHP 4/PHP 5)
Chapitre 14. Gestion des Exceptions (PHP 5)
Chapitre 15. Contrôle de sessions
Chapitre 16. PHP - Ajax
Chapitre 17. Webservices & SOAP
Chapitre 18. PHP en chiffre
Chapitre 19. Conclusion
Chapitre 20. Bibliographie
Page d'accueilTable des matièresNiveau supérieurPage précédenteBas de la pagePage suivante

Chapitre 17. Webservices & SOAP

Un service web, ou webservice – en anglais ça fait plus chic - voire même SOA (Service Oriented Architecture – ça fait plus pro) permet à des applications de conceptions et de réalisations différentes de communiquer entre elles, et qui plus est, sans avoir à se soucier de l’implémentation. Ce couplage entre applications, appelé ‘faible’, permet ainsi de réaliser de « nouvelles’ applications par assemblages et/ou appels de services fournis par d’autres.

Il existe plusieurs méthodes de communication, nous retiendrons ici uniquement le protocole SOAP, issu du RPC (Remote Procedure Call) puis du XML-RPC (le même mais avec des appels en XML pour masquer encore plus l’hétérogénéité des implémentations). Le protocole SOAP (Simple Object Access Protocol) permet à des objets d’en appeler d’autres distants (comme avec Java/RMI par exemple) mais en utilisant le protocole HTTP comme protocole de communication (il est possible de faire entre autre également du SMTP) sans se soucier de leur implémentation, et avec une uniformité de représentation des données. Il autorise ainsi la communication et l’échange de messages/données entre objets distants.

Le mécanisme est le suivant : 

Figure 1

Lors d'un échange SOAP, le message transmis se décompose en 2 parties :

1. L'enveloppe, qui contient toutes les informations relatives au contenu du message ;
2. Le contenu lui-même qui est formé de données structurées (méthodes formatées, interrogation structurée d'après les besoins du serveur, etc.).

Afin de savoir comment utiliser un service web, ce dernier est décrit selon dans un langage de description de service web basé sur XML : le WSDL (Web Services Description Language). Il donne une définition abstraite des services, le détail des types de données échangées, les opérations possibles, le protocole à utiliser ainsi que l'adresse (URL) du service. Le fichier WSDL de chaque webservice peut être publié dans un annuaire. Le fichier WSDL associé à un webservice représente en quelque sorte sa notice d’utilisation.

Dans sa version 5, le PHP intègre en natif une gestion du protocole SOAP.

Fichier wsdl

<?xml version='1.0' encoding='UTF-8'?>

<!-- WSDL file generated by Zend Studio. -->

<definitions                        name="exemple"                             targetNamespace="urn:exemple"                         xmlns:typens="urn:exemple"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

xmlns="http://schemas.xmlsoap.org/wsdl/"                                              xmlns:typens0="http://iparla.iutbayonne.univpau.

fr/~roose/wsdl/moteur.php">

                                  <message name="retourDate"/>

                                  <message name="retourDateResponse">

                                            <part name="retourDateReturn"/>

                                  </message>

                                  <portType name="essai_instancePortType">

                                                <operation name="retourDate">

                                                                   <input message="typens:retourDate"/>

                                                                   <output message="typens:retourDateResponse"/>

                                              </operation>

                                   </portType>

                                   <binding name="essai_instanceBinding" type="typens:essai_instancePortType">

                                                      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

                                                      <operation name="retourDate">

                                                                       <soap:operation soapAction="urn:essai_instanceAction"/>

                                                                       <input>

                                                                                                          <soap:body                      namespace="urn:exemple"                               use="encoded"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

                                                                       </input>

                                                                       <output>

                                                                                                           <soap:body                      namespace="urn:exemple"                               use="encoded"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

                                                                      </output>

                                                  </operation>

                                </binding>

                                <service name="exempleService">

                                                                     <port name="essai_instancePort" binding="typens:essai_instanceBinding">

                                                                                 <soap:address                                                                  location="http://iparla.iutbayonne.univpau.

fr/~roose/wsdl/moteur.php"/>

                               </port>

                </service>

</definitions>

Moteur.php (serveur)

<?php
class DateServer{

//On déclare notre méthode qui renverra la date et la signature du serveur dans un tableau associatif...
function retourDate(){
              $tab = array(
                              'serveur' => $_SERVER['SERVER_SIGNATURE'],
                              'date' => date("d/m/Y"),
                              'auteur' => "service web appele" //attention, unaccent => erreur
                               );
            return $tab;
}
}

//Cette option du fichier php.ini permet de ne pas stocker en cache le fichier WSDL, afin de pouvoir faire
nos tests
//Car le cache se renouvelle toutes les 24 heures, ce qui n'est pas idéal pour le développement
ini_set('soap.wsdl_cache_enabled', 0);

//Instanciation du SoapServer
$serversoap=new SoapServer("http://iparla.iutbayonne.univ-pau.fr/~roose/wsdl/exemple.wsdl");

// on peut aussi déclarer plus simplement des fonctions
//par l'instruction addFunction() : $serversoap->addFunction("retourDate"); à ce moment-là nous ne
faisons pas de classe.

//Noter le style employé pour la déclaration : le nom de la classe est passé en argument de type String,
et non pas de variable...
$serversoap->setClass("DateServer");

//Ici, on dit très simplement que maintenant c'est à PHP de prendre la main pour servir le Service WEB :
il s'occupera de l'encodage XML, des

//Enveloppes SOAP, de gérer les demandes clientes, etc. Bref, on en a fini avec le serveur SOAP !!!!
$serversoap->handle();
?>

Client.php

<?php
//Cette option permet d'éviter la mise en cache du WSDL, qui se renouvelle toutes les 24 heures... Pour
le développement, ce n'est pas génial !!!
ini_set('soap.wsdl_cache_enabled', 0);

//On doit passer le fichier WSDL du Service en paramètre de l'objet SoapClient
$service=new SoapClient("http://iparla.iutbayonne.univ-pau.fr/~roose/wsdl/exemple.wsdl");

//On accède à la méthode de notre classe DateServeur, déclaré dans notre SoapServer
$taballservices=$service->retourDate();

//On renvoie le résutat de notre méthode, pour voir...
print_r($taballservices); // affiche les éléments d'un tableau
?>

Page d'accueilTable des matièresNiveau supérieurPage précédenteHaut de la pagePage suivante