Web-Service en SOAP avec php

Web-Service en SOAP avec php

sommaire :

  1. Le fonctionnement
  2. Création du wsdl
  3. Du serveur au client
  4. Debugger un web-service
 

Dans cet article, nous allons apprendre à faire notre premier web-service SOAP en 15 minutes top chrono !

Pour suivre, il est indispensable d’utiliser eclipse, car celui-ci possède un mode graphique pour la création de web-service qui va nous faciliter la vie.

Le fonctionnement


Avant toutes choses, je vais vous expliquer rapidement le fonctionnement d’un Web-Service.

Vous savez certainement qu’un Web-Service est un programme qui permet la communication et l’échange de données entre des applications et des systèmes totalement différents.

Pour que le Web-Service puisse communiquer avec n’importe quels systèmes, il faut utiliser un même format de données. Pour nous, ça sera le SOAP(c’est un protocole procédural basé sur du XML). Dans ce format, il faut aussi bien définir les données qui seront reçues et envoyées par le Web-Service.

Ne vous inquiétez pas si cela vous paraît trop abstrait, on va tout expliquer avec un exemple. :)


Par exemple grâce à Web-Service, on pourrait faire communiquer une application java d’un téléphone portable avec une application en php. (ça fait rêver … :D)

Voici une petite illustration du fonctionnement de ce Web-Service :


Première étape :
L’application java va faire appel au web-service en envoyant un message WSDL (en SOAP).


etape1


Deuxième étape :
Le serveur de Web-Service reçoit la demande, effectue un traitement en fonction de celui-ci et renvoie la réponse dans un format WSDL.


SOAP PHP


Qui avait dit que c’était compliqué les web-service ;) ?


Fini la théorie passons à la pratique, nous allons faire un Web-Service qui nous donne le jour en fonction de la date que l’on envoie.

Création du wsdl


Par exemple, on envoie le 13/11/2009 et le web-service nous renverra vendredi. Si on fait un schéma, cela va donner ça.

soapws

Nous allons créer un nouveau projet que nous appellerons MonWebService (il n’y a pas plus clair ^^).


On va commencer par faire le format WSDL (fichier soap) de notre web service.


ws11


On le nomme monFormat.wsdl

Pour nous aider, Eclipse nous construit automatiquement un format wsdl par défaut, nous allons le reprendre et le paramétrer. Mais avant tout, je vais vous parler rapidement de l’interface.




En bas à Gauche, vous avez remarqué 2 onglets :
    Desing => l’interface
    Source => le format wsdl que l’interface génère
Rassurez vous, nous aurons pas à toucher au fichier source, on va créer notre format wsdl seulement avec l’interface :)

Vous devriez voir ça, normalement :


eclipse affichage defaut wsdl soap webservice

C’est avec la boîte à gauche que l’on définit l’adresse du serveur du web-service ( c’est là où tout le traitement php va se faire), Dans le champ de saisie, il faudra mettre : http://localhost/MonWebService/serveur.php


A droite, ce sont les différents services (ou opérations) que le web-service propose.

Dans notre exemple, nous proposons qu’un seul service. On va l’appeler QuelJour.
Le nom de l’opération par défaut est NewOperation en double cliquant dessus on peut le renommer.

C’est d’ailleurs ce que l’on va faire en le renommant QuelJour.


Juste en dessous, on voit 2 lignes :

Input qui représente les données que va recevoir le Web-Service
Output qui représente les données que va envoyer le Web-Service


Tout le monde suit ? :)


Nous allons définir le paramètre d’entrée.

En entrée, on aura besoin d’une chaine de caractère(string).
Pour se faire, on fait un clique droit sur case la plus à droite de la ligne input, dans le menu contextuel
On clique sur Set Type puis Existing Type et là on sélectionne string.


On réitère cette opération pour le paramètre de sortie.


Ce qui va donner :
webservice wsdl interface eclipse


Voilà nous avons définit notre format de web service !


Du serveur au client

On va s’attaquer à notre serveur, préparez vos doigts ça va coder !

On va le nommer serveur.php
Attention, le chemin de votre fichier doit être le même que celui que vous avez paramétré dans votre web-service.

Ex : http://localhost/MonWebService/serveur.php => C:\wam\www\MonWebService\serveur.php

Voici le code source, les commentaires parlent d’eux-même :

// Pour supprimer le cache du web-service
ini_set('soap.wsdl_cache_enabled', 0);
// Pour définir le temp maximal d'éxecution de notre web-service
ini_set('default_socket_timeout', 180);

// Nom de notre web-service
class Server {
     // Le service QuelJour que l'on a définit dans notre format wsdl
    function QuelJour($parm) {
    	return 'Web-Service ok';
    }
}
// On tente d'instancier la classe soapServer
// Si cela s'avère impossible, on affiche une erreur
try {
    $server = new SoapServer('monFormat.wsdl',  array('trace' => 1,'encoding'	=> 'ISO-8859-1'));
    // On définit la classe qui va gérer les requêtes SOAP (pour nous c'est la class Server)
    $server -> setclass('Server');
    $server->setPersistence(SOAP_PERSISTENCE_REQUEST);
} catch (Exception $e) {
    echo 'erreur'.$e;
}
// Si l'appel provient d'un Web-Service
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	try {
		$server -> handle();}
	catch (Exception $e) {
    echo 'erreur'.$e;
	}
}
// Facultatif seulement pour montrer les fonctions disponibles par le web-service
else {
    echo '<strong>This SOAP server can handle following functions : </strong>';
    echo '<ul>';
    foreach($server -> getFunctions() as $func) {
        echo '<li>' , $func , '</li>';
    }
    echo '</ul>';
}



Si tout se passe bien et si on se rend sur cette adresse :
http://localhostMonWebService/serveur.php


On devrait voir :
web service php serveur soap wsdl


Tout marche ? On est trop fort \o/


Pour l’instant, on va juste afficher un message qui indique que le web-service fonctionne bien. (eh oui, on commence simple pour faire plus compliquer ensuite :) )


Côté client, nous allons créer un fichier client.php

// Pour supprimer le cache du web-service
ini_set('soap.wsdl_cache_enabled', 0);

// Nouveau Client SOAP
try {
    // Nouvelle instance de la classe soapClient
   $client = new SoapClient('http://localhost/MonWebService/monFormat.wsdl', array('trace' => 1));
   $parm = date('Y-m-d');
    // Appel de la méthode QuelJour du service web
   try{
    $oReturn =  $client -> __soapCall('QuelJour', array('string' =>$parm));
	} catch (SoapFault $fault) {
    	trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
	}
        // affiche le résultat
	var_dump($oReturn);
} catch (SoapFault $fault) {
    echo 'erreur : '.$fault;
}

On a plus qu’à se rendre sur http://localhostMonWebService/client.php pour voir notre message.


Eh voilà la mécanique est en place, on va pouvoir améliorer notre web-service, mais là on ne va rien apprendre, ce n’est que du php :).


On va revenir sur notre serveur (fichier serveur.php), dans la fonction QuelJour
pour traiter la chaîne en paramètre.


Notre fonction va donc devenir :

    function QuelJour($parm) {
    	$aJour[1] = 'Lundi';
    	$aJour[2] = 'Mardi';
    	$aJour[3] = 'Mercredi';
    	$aJour[4] = 'Jeudi';
    	$aJour[5] = 'Vendredi';
    	$aJour[6] = 'Samedi';
    	$aJour[0] = 'Dimanche';
    	return $aJour[date("w",strtotime($parm))];
    }

Debugger un web-service

Le debugage d’un web-service est toujours difficile. Le client interprète directement la réponse du web-service et si la réponse n’est pas correctement formaté (qui ne respecte pas le format wsdl du web-service), il affiche une erreur du type :

( ! ) Fatal error: SOAP Fault: (faultcode: Client, faultstring: looks like we got no XML document) in /var/www/MonWebService/client.php on line 17 Call Stack #TimeMemoryFunctionLocation 10.000158584{main}( )../client.php:0 20.002180708trigger_error ( )../client.php:17


Mais il ne renvoie pas l’erreur php du serveur. Je suis d’accord avec vous, ce n’est pas facile la vie d’un développeur :’(
Pour savoir, ce que renvoie exactement le serveur, nous allons utiliser l’application SOAPUI


Une fois installée, vous allez créer un projet. Pour ceci vous allez dans
File New soapUIProject.


Là, une fenêtre apparaît, vous cliquez sur parcourir (browse…), vous sélectionnez votre fichier wsdl
(monFormat.wsdl) puis OK.

web service xsql soapui


Dans le menu projects, vous déroulez votre arborescence monformat jusqu’à voir le nom de la fonction que vous voulez tester, (pour nous c’est Queljour).

Clique droit puis New Request et SoapUI créer votre interface pour communiquer avec les web-service.


Si vous avez bien suivit, voila ce que vous devriez voir :


webservice debug entete http

Vous avez plus qu’à faire les tests et récupérer directement le résultat du web service.

Les erreurs :


Pendant le développement de différents de web-services, je suis tombé sur des erreurs de toute part, malheureusement je ne les ai pas tous mémorisé mais voici un début de liste qui pourrait vous aider. Si vous aussi vous êtes embétez un petit commentaire et on pourra certainement vous aider. :)


SoapFault exception: [HTTP] Not Found in /var/www/lab/customer.php:10 Stack trace: #0 [internal function]: SoapClient->__doRequest(’__call(’getServerDate’, Array) #2 {main}
=> wsdl trouve pas le serveur

Note de l'article




1 Star2 Stars3 Stars4 Stars5 Stars (10 votes, moyenne: 3,20 max : 5)
Loading ... Loading ...

  1. Ariden Says:

    Merci pour ce tuto sur la création d’un web service.

  2. Kiosk Says:

    Bonjour,

    Merci pour ce didacticiel… auquel il manque quelques infos et prérequis pour que je puisse aller au bout dès maintenant.

    Selon le principe de “ce qui va sans le dire va mieux en le disant”, il serait préférable d’indiquer qu’au préalable il faut valider php_soap dans les extensions php (Sous Wamp, clic gauche sur l’icône Wamp en bas à doite de l’écran, cliquer sur PHP, puis sur Extensions PHP, puis sur php_soap si ce n’est pas déjà coché). Sinon, ça marche un peu moins bien. (En fait, pas du tout !)

    Il serait bien de dire aussi dès le départ quels sites on va créer, pour savoir où placer les différents fichiers.
    J’ai créé MonServiceWeb, qui contient monFormat.wsdl et serveur.php, et un site MonSiteClient, qui contient client.php.

    Quand je lance client.php, j’obtiens :
    string(5) “Jeudi”
    Je m’attendais à obtenir :
    Jeudi

    C’est normal où j’ai merdu quelque-part ? (Bon d’accord, je pourrais aussi lire le code et essayer de deviner la réponse).

    Après, je décroche un brin (au départ, j’ignore presque tout de SOAP, ce qui n’aide pas).

    “Pour savoir, ce que renvoie exactement le serveur, nous allons utiliser l’application SOAPUI”.

    Euh !… Oui… C’est quoi cette appli SOAPUI ?
    Le moteur de recherche m’a envoyé directement sur la page de votre didacticiel, et par conséquent je ne sais pas a priori de quoi il s’agit, si d’aventure votre site le précise ailleurs.

    http://www.soapui.org/new_and_noteworthy_2.html

    Une fois téléchargé et installé le fichier, j’obtiens une appli Java soapUI 2.0.1. dans laquelle le menu “File” ne propose pas “new soapUIProject” mais “new WSLDProject”. Je fais comme si c’était la même chose, et par browse, je me trimballe jusqu’au fichier monFormat.wsdl et l’importe, après avoir dû nommer au passage le projet (autant l’appeler MonServiceWeb, comme sous Eclipse).

    Une fois le fichier installé dans la fenêtre Navigator, j’en déploie les éléments. Sous “QuelJour”, il y a déjà une requête, nommée “Request 1″.
    Dans la fenêtre Request 1, onglet XML, j’ai le même code source que dans le didacticiel, sauf que j’ai un “?” à la place de la date.

    Je remplace ? par 2009-11-29 et, comme il ne se passe rien, je regarde quelles sont les icônes disponibles. Une petite flèche verte en haut à gauche. Je clique, ça travaille. Dans la fenêtre voisine, du code apparaît, qui ressemble à celui du didacticiel. Sauf qu’au lieu de , j’ai .
    Moralité : quelque chose a merdu, mais quoi ?

    Je rétablis le “?” et relance la flèche verte : Cette fois-ci, j’obtiens Jeudi (nous sommes jeudi, en effet).

    Je change les valeurs à nouveau, et j’obtiens le même résultat. A un moment, j’obtiens un message d’erreur. Puis même en remettant le “?” j’ai toujours le message d’erreur. Je vire Request 1 et en recrée un nouveau : plus de réponse, cadre vide (connexion refusée). En fait, Je vois que l’URL du serveur a changé (localhost:8080). Je rétablis l’URL http://localhost/MonWebService/serveur.php, et ça remarche, mais uniquement avec “?”. Pas moyen d’entrer une date comme 2009-11-29 pour obtenir autre chose que “Jeudi”.

    Juste pour dire qu’à partir de soapUI le didacticiel est un peu trop succinct.

    Sinon, mon objectif état de voir comment un fichier WSDL peut-être utilisé, contrat rempli. Il me reste à creuser un peu dans le détail.

Donner votre avis :