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 ?> |