Produire un WebService SOAP avec Zend Framework

Produire un WebService SOAP avec Zend Framework

Plusieurs méthodes existent pour créer des WebServices SOAP.

  • Contract First ou Top-Down : le fichier WSDL est écrit en premier, puis l’implémentation.
  • Code First ou Bottom-Up : l’implémentation est d’abord faite, puis le fichier WSDL est généré à partir du code écrit.

Il est souvent recommandé d’utiliser la première méthode, mais rédiger un fichier WSDL peut vite devenir compliqué (même si de plus en plus d’outils aide à sa réalisation).

Nous allons voir dans cette article comment mettre en place la 2ème méthode.

Pour réaliser les exemples ci-dessous, j’ai utilisé la version 1.10.3 du framework de Zend que vous pouvez télécharger ici : http://framework.zend.com/download/archives.

Création de la classe de service

Avant de commencer l’implémentation avec le framework Zend, nous allons mettre en place une classe qui regroupera les différentes méthodes qui seront exposées via notre WebService.

Cette classe sera enregistrée dans un sous-répertoire des controllers (services) dans le fichier MonWebService.php.

<?php
class MonWebService {
  // ...
}
?>

Nous allons simplement définire une fonction qui fera l’addition de 2 entiers passés en paramètres.

Bien entendu, il est possible de définir autant de méthodes qu’on le souhaite.

La classe est alors codée comme suit :

<?php
class MonWebService {

  /**
   * Addition de 2 entiers
   * @param integer $a
   * @param integer $b
   * @return integer
   */
  public function add($a, $b) {
    return $a + $b;
  }

}
?>

Vous pouvez remarquer le commentaire de la fonction : il sera repris lors de la génération du fichier WSDL. N’oubliez pas de l’adapter à vos besoins.

En fait, en respectant la syntaxe PHP docblock, le fichier WSDL généré pour typer les paramètres et les valeurs de retours des fonctions exposées.

Mise en place du controller

Nous allons maintenant définir le controller qui permettra de retourner la WSDL et de traiter les requêtes SOAP.

Pour cela, nous créons un controller appelé WsController avec une seul action index.

<?php
require_once APPLICATION_PATH . '/controllers/services/MonWebService.php';

class WsController extends Zend_Controller_Action {

  public function indexAction() {
    if (is_null($this->getRequest()->getParam('wsdl'))) {
      // Traitement de la requête
      $server = new Zend_Soap_Server('http://monserveur/ws/?wsdl');
      $server->setClass('MonWebService');
      $server->handle();
    } else {
      // Retour de la WSDL
      $wsdl = new Zend_Soap_AutoDiscover();
      $wsdl->setClass('MonWebService');
      $wsdl->handle();
    }
    exit;
  }

}
?>

Nous vérifions si l’utilisateur a demandé la WSDL (présence du paramètre wsdl) ou a fait un requête.

Ainsi, pour afficher la définition du WebService, il suffit d’appeler l’adresse http://monserveur/ws/?wsdl.

Pour exécuter le WebService, l’adresse à appeler est http://monserveur/ws/.

Test du WebService

Pour tester notre WebService, plusieurs méthodes sont possibles.

Personnellement, j’utilise le logiciel soapUI : https://www.soapui.org/.

Pour ceux qui ne souhaitent pas télécharger cet outil, nous allons mettre en place un controller permettant d’appeler notre WebService.

Création du controller

Dans un premier temps, nous allons créer un controller appelé WsClientController :

<?php
class WsClientController extends Zend_Controller_Action {

  public function indexAction() {
    // Récupération des 2 paramètres
    $a = $this->getRequest()->getParam('a');
    $b = $this->getRequest()->getParam('b');

    // Appel du WebService
    $client = new Zend_Soap_Client('http://monserveur/ws/?wsdl');
    $result = $client->add($a, $b);

    // Passage des informations à la vue
    $this->view->a = $a;
    $this->view->b = $b;
    $this->view->result = $result;
  }

}
?>

Comme vous pouvez le remarquer, l’appel du WebService se fait en 2 étapes :

  1. La création du client Zend_Soap_Client
  2. L’appel de la méthode directement sur l’instance du client

Ce code ne tient pas compte de l’existence des paramètres, de leur type…

Il s’agit simplement d’un test pour valider le bon fonctionnement de notre WebService.

Création de la vue

Il nous faut maintenant afficher le résultat.

<h1>
<?php printf('%s + %s = %s', $this->a, $this->b, $this->result) ?>
</h1>

Nous affichons simplement la formule mathématique et le résultat.

Test

En appelant l’adresse http://monserveur/wsclient?a=1&b=2, on obtient 1 + 2 = 3.

Le résultat de l’addition a bien été calculé par le WebService.

Erreurs rencontrées

SOAP extension is not loaded

L’extension PHP permettant de gérer les appels SOAP n’est pas activée dans le fichier de configuration.

Il faut éditer le fichier php.ini et activer php_soap.dll ou php_soap.so.