Dans la programmation orientée objet, vous aurez souvent entendu parler de « Web services ». De tels services web sont des interfaces de programmation ou des programmes que l’on interroge pour récupérer des données. L’échange de données se fait via le protocole SOAP (pour Simple Object Access Protocol), qui est basé sur XML.
Il nous est donc possible d’appeler une fonction d’un service distant, celui-ci retournant des données selon un format défini dans un fichier XML appelé WSDL (pour Web Services Description Language), qui décrit notamment le protocole de communication, le format des messages que le service peut recevoir ou envoyer et les méthodes qui peuvent être invoquées à distance.
Les messages et les opérations sont décrits de manière abstraite, mais ils seront ensuite liés à un protocole réseau et traduits dans un format concret.
Principaux éléments du WSDL
<binding>
- Définition du protocole d’échange des données.
- Spécifie le format des données échangées pour les opérations.
- Possibilité d’utiliser SOAP en tant que protocole.
<port>
- Spécifier une adresse unique pour un « binding » choisi, donc l’emplacement actuel du service.
<service>
- Un service est un ensemble de ports, eux-mêmes associés à un « binding ».
- Décrit un ensemble de points finaux du réseau (« endpoint »).
Implémenter un Webservice avec Zend
Le framework Zend propose aux utilisateurs des classes qui permettent l’utilisation ou l’appel de Web Services. Bien sûr il nous faut créer au préalable notre service ! Ensuite, il faut logiquement créer le WSDL correspondant, ou plutôt le générer grâce aux outils PHP. Mais Zend Framework nous permet de générer le descripteur de service à la volée.
Classe du WS
ini_set("soap.wsdl_cache_enabled", "0");
require_once 'Zend/Soap/AutoDiscover.php';
class helloWS
{
/**
* @return string
*/
public function getHello()
{
return 'Hello World';
}
}
La première ligne permet de désactiver le cache afin que le descripteur soit recréé lorsque la classe du Web Service a été modifiée. On empêche ainsi le service d’être stocké en mémoire ou sur disque. La seconde ligne est comme un « import » en Java, on demande à utiliser la classe « AutoDiscover » de Zend. Elle offre des fonctions permettant par exemple de générer et envoyer le descripteur WSDL au client lorsque celui-ci l’a exigé.
La classe décrite ici possède une fonction qui retourne une chaîne de caractères. Le commentaire, précisant le type de donnée retournée, est obligatoire. Il permet au générateur d’inclure le type de données dans le descripteur du service, pour l’opération donnée.
A la fin de la classe, il faudra rajouter les lignes suivantes :
if(isset($_GET['wsdl']))
{
$wsdl = new Zend_Soap_AutoDiscover();
$wsdl->setClass('helloWS'); // Ajoute le nom de classe
$wsdl->handle();
}
else
{
$server = new SoapServer(
'http://yoursite.com/svc/helloWS.php?wsdl'
);
$server->setClass('helloWS');
$server->setObject(new helloWS());
$server->handle();
}
Ces instructions permettent de générer le WSDL mais aussi de créer un « serveur » SOAP qui utilise la classe du Web Service et un nouvel objet, basés bien sûr sur le WSDL généré.
Sur la version testée de Zend Framework, il était impossible de créer une nouvelle instance de la classe « Zend_Soap_Server« . Ainsi, comme PHP intègre déjà cette fonctionnalité, c’est cette dernière qui a été utilisée dans l’exemple, comme vous aurez très bien pu constater.
Client
$client = new Zend_Soap_Client(
'http://yoursite.be/svc/helloWS.php?wsdl'
);
$newString = $client->getHello();
// Affiche la chaîne récupérée
echo $newString;
On crée un nouveau client de type « Zend_Soap_Client », avec comme paramètre l’URL vers le descripteur du service en question. Ensuite on appelle la fonction « getHello() » de helloWS, qui nous retourne une chaîne de caractères. On affiche celle-ci à l’écran grâce à « echo ».
Comme toujours les services web sont très pratiques surtout si on souhaite appeler des fonctions d’une librairie se trouvant sur un serveur distant, grâce aux requêtes SOAP. Il est aussi possible de communiquer dans le format JSON grâce à une autre méthode de communication qui n’existe pas telle quelle dans le framework mais qu’on peut créer soi-même.