Aller au contenu | Aller au menu | Aller à la recherche

Site membre du réseau Izardev et LCNET

Créer un webservice avec Code Igniter

Dans un article il y a quelques mois, nous avions abordé la création d'un webservice en PHP, Cet article propose la création d'un webservice en utilisant le Framework CodeIgniter.
Codeigniter est un Framework écrit en PHP. IL est idéal pour normaliser le développement de petites applications Web. Il a néanmoins certains manques, et parmi ces manques la gestion complète des Webservices.

Pour palier à cette carence, je propose d'utiliser un composant du framework Zend : téléchargeable sur le site Zend Framework.

Installation des composants Zend Framework

Il s'agit là tout simplement d'ajouter les composants minimaux du Framework, et d'ajouter dans notre configuration de PHP (php.ini) le path du Zend Framework vers ces composants. Si le framework Zend a un avantage, c'est celui de pouvoir être utilisé de manière composite.

Décompressez pour cela l'archive ZendFramework-1.10.8-minimal.tar.gz et ajoutez le répertoire library quelque part sur votre serveur. Ajoutez ensuite ce répertoire dans l'include_path, par exemple, si vous placez le dossier library dans /usr/local/php :

include_path=/usr/local/php/library

Redémarrez ensuite votre serveur apache, jeter un coup d'oeil au phpinfo() permet de voir si l'inclusion a fonctionné. Nous pouvons maintenant utiliser les classes du Framework Zend dans tous les projets hébergés par cette machine.

Création de la classe du Webservice

Nous allons stocker nos webservice dans un répertoire de notre application, j'ai choisi de créer le répertoire /system/application/soap/.
Je crée donc ma classe SoapServerTest, qui va effectuer divers traitements :

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
class soapservertest
{
    var $ci;
    /**
     * Méthode très intéressante
     * @return string
     */
    function HelloWorld()
    {
        return "Hello World";
    }
    /**
     * Dis bonjour à quelqu'un
     * @param string $someone
     * @return string
     */
    function SayHelloToSomeOne($someone)
    {
        return "Hello $someone";
    }
    /**
     * Renvoi un tableau
     * @return array
     */
    function getWebsites()
    {
        return array('http://www.ligams.com','http://ligams.net');
    }
    /**
     * Appelle la base de donnée du site
     * @return string
     */
    function callSomethingInDataBase()
    {
        $this->ci =& get_instance();
        $this->ci->load->model('XXXXXX');
        $users = $this->ci->XXXXXX->selectAll();
        return json_encode($users);
    }
}
?>

Attention : si ce n'est pas dans vos habitudes, il est obligatoire de commenter ces méthodes, spécifiez un type de retour et pour les paramètres (typage fort qui n'existe pas en PHP...), afin que le Zend Framework génère correctement le fichier WSDL (avec la classe Zend_Soap_AutoDiscover).

Notez que nous avons :

  • une méthode HelloWorld simple,
  • une méthode qui prend un paramètre,
  • une méthode qui renvoi un tableau,
  • une méthode qui appelle la base de données de notre application CodeIgniter.

Ok, maintenant, passons au serveur.

Webservice Soap Server

Nous allons maintenant créer un controller dans notre application, afin de déployer notre service Soap. Créez une classe webservice étendant la classe Controller fichier /system/application/controllers/webservice.php :

<?php
//inclure le server soap Zend
require('Zend/Soap/Server.php');
//pour générer automatiquement le fichier WSDL
require('Zend/Soap/AutoDiscover.php');

class webservice extends Controller
{
    function serve($class,$wsdl = null)
    {
        /*
         * sous-entend que vous placez vos classes webservice class dans le répertoire soap de votre app
         * et qu'il est nommé NOMDEVOTRE WEBSERVICE.php
         */
        $path = APPPATH.'soap/'.$class.'.php';
        if(file_exists($path))
        {
            require($path);
            

            if($wsdl=='wsdl')
            {
                ini_set("soap.wsdl_cache_enabled",0);
               
                $wsdl = new Zend_Soap_AutoDiscover();
                $wsdl->setUri(base_url().get_class($this).'/serve/'.$class);
                $wsdl->setClass($class);
                $wsdl->handle();
            }
            else
            {
                $szWSDLUrl = base_url().get_class($this).'/serve/'.$class.'/wsdl';
                $options = array('soap_version' => SOAP_1_2);
                $server = new Zend_Soap_Server($szWSDLUrl,$options);
                $server->setClass($class);
                $server->handle();
            }
        }
        else
        {
            show_404();
        }
    }
}
?>

Très simple, n'est ce pas ? Maintenant, grâce aux classes du Framework Zend, notre class Webservice est prête, et le fichier WSDL est sera généré tout seul ET dynamique (ce qui n'est pas peu en PHP).

La premier paramètre de la méthode serve spécifie la class de notre webservice (et également sa localisation dans le répertoire /system/application/soap/)

Ce qui donne :

  • Adresse du fichier WDSL : http://example.com/webservice/serve/soapservertest/wsdl
  • Adresse du Webservice : http://example.com/webservice/serve/soapservertest

Maintenant, ce service est accessible, ouvrez le fichier wsdl dans votre navigateur pour vérifier qu'il est correctement généré et passons au client.

Client webservice CodeIgniter

créons un autre controleur webservice_client dans /system/application/controllers/webservice_client.php

<?php
//inclus la classe Zend_Soap_Client
require_once('Zend/Soap/Client.php');

class webservice_client extends Controller
{
    function index()
    {
       $szWSDLUrl = base_url().'webservice/serve/soapservertest/wsdl';
       $szLocation =  base_url().'webservice/serve/soapservertest/';
       try
       {
           $options = array(
            'soap_version' => SOAP_1_2,
            'location' => $szLocation
            );


            $client = new Zend_Soap_Client($szWSDLUrl,$options);
           $result = $client->HelloWorld();
           print $result;
       }
       catch (SoapFault  $exception)
       {
          print_r($exception);
       }
    }
}
?>

Maintenant, affichez la page, vous devriez voir "Hello World" apparaître : http://example.com/webservice_client

Félicitations, vous venez de mettre en place un webservice sur votre site, et ne vous fatiguerez plus à générer vos WSDL à la main :-)

Articles connexes

Partagez cet article !

  • Delicious
  • Stumbleupon
  • Digg
  • Facebook
  • Google
  • Linkedin
  • Yahoo Buzz
  • Twitter
Vous avez apprécié cet article ?

Commentaires S'abonner au flux RSS des commentaires

  1. Il date légèrement, en réalité, il est pour la version 1.7.x du framework, je serais bien incapable de dire s'il est toujours d'actualité avec codeigniter V2, n'y ayant pas encore gouté.

    Merci pour ton retour :)
  2. super sympa ton tuto ! reste plus qu'a mettre en pratique pour le prendre bien en main.
    Je n'ai pas trouvé la date de publication de ce thread, mais je pense qu'il date un peu car il y a quelques soucis avec le nom des classes héritées.

    (class MonController extends Controller, devient maintenant class MonController extends CI_Controller )

    Bonne continuation !

Ajouter un commentaire

Les commentaires sont tous validés par un modérateur, votre commentaire n'apparaît pas directement sur le site.
Aucun support n'est assuré ici, vous pouvez néanmoins laisser vos remarques et critiques sur l'article, les points de vue pertinents sont toujours les bienvenus.