DU PLM TP : produire et consommer des services web en PHP NuSOAP est une librairie PHP proposée par NuSphere et Dietrich Ayala. Elle fournit un ensemble de classes (aucune extension PHP n est requise au niveau du serveur HTTP) permettant aux développeurs de facilement créer et consommer des services web fondés sur SOAP 1.1, WSDL 1.1 et HTTP 1.0/1.1. Exercice 1 : développer un programme Client On vous suggère dans cet exercice d interagir avec un service web dont la description WSDL est disponible ici : http://wsf.cdyne.com/spellchecker/check.asmx?wsdl. 1.1. Etudier ce fichier WSDL. Retrouver son nom, son adresse, les méthodes proposées et, pour chacune d entre elles, donner leur signature. 1.2. A l aide de l Annexe 1, développer un programme Client SOAP permettant d invoquer une méthode de ce service et de visualiser la réponse retournée par le service. 1.3. Etudier les messages SOAP transmis et reçus par le Client, et identifier les différents éléments qui les constituent. 1.4. Même question que la 1.2, mais développer cette fois un programme Client REST à l aide du code suivant : $result = file_get_contents('url_de_la_ressource', stream_context_create(array('http' => array('method' => 'methode_http_utilisee'))) ); echo '<pre>'. htmlspecialchars($result). '</pre>'; Exercice 2 : premier serveur SOAP Il s agit dans cet exercice de déployer un service SOAP fournissant une ou plusieurs opérations d une calculatrice, et de composer une IHM web permettant d invoquer les méthodes proposées. Cette IHM pourra également utiliser les opérations proposées par les autres étudiants, ne choisissez donc pas tous les mêmes opérations et ne vous limitez pas aux opérations de base Note : les fonctions mathématiques de PHP sont décrites ici http://php.net/manual/fr/book.math.php. 2.1. A l aide de l Annexe 2, développer un programme Serveur implémentant les opérations de votre choix. Consulter le fichier WSDL de votre service afin de vérifier l absence d erreur de syntaxe ainsi que la signature des méthodes déployées ; pour consulter le fichier WSDL, vous devez ajouter les caractères?wsdl à la suite de l URL de localisation de votre service.
2.2. Développer un programme Client capable d invoquer la ou les méthodes de votre service. 2.3. A partir de l Annexe 3, proposer un formulaire HTML représentant une calculatrice et dont le traitement correspond à l invocation du programme Client développé en 2.2. 2.4. Demander à vos collègues l URL de localisation du fichier WSDL de leur service (ce service devra de préférence proposer d autres opérations que celles implémentées au sein de votre service), et compléter l IHM de votre calculatrice à l aide de boutons permettant l émission de requêtes vers ce(s) service(s).
Annexe 1 : squelette d un programme Client SOAP /// Masquage des "warnings" ini_set( "display_errors", 0); /// Utilisation de la bibliothèque NuSOAP require_once("nusoap.php") ; /// Création et initialisation du client SOAP $clientws = new nusoap_client('url_localisation_service'); $error = $clientws->geterror(); if ($error) die ("Une erreur s'est produite lors de la création du client SOAP..."); /// Initialisation des attributs de l'enveloppe de la requête SOAP $clientws->namespaces = array('soap-env' => 'http://schemas.xmlsoap.org/soap/envelope/', 'ns1' => 'url_espace_nommage'); /// Initialisation du corps de la requête SOAP $body = "<ns1:nom_methode>". "<ns1:paramin1>valeur_paramin1</ns1:paramin1>". "<ns1:paramin2>valeur_paramin2</ns1:paramin2>". "<ns1:paraminn>valeur_paraminn</ns1:paraminn>". "</ns1:nom_methode>"; /// Invocation de la méthode GetVideo $result = $clientws->call('nom_methode', $body, '', 'url_methode', null, 'document', 'literal'); if ($clientws->fault) die ("Une erreur s'est produite lors de l'appel de la méthode "); /// Affichage de la requête et de la réponse SOAP echo "<h2>request</h2>"; echo "<pre>".htmlspecialchars($clientws->request)."</pre>"; echo "<h2>response</h2>"; echo "<pre>".htmlspecialchars($clientws->response)."</pre>"; /// Affichage des résultats echo "<pre>"; print_r($result); echo "</pre>";
Annexe 2 : squelette d un programme Serveur SOAP /// Masquage des "warnings" ini_set( "display_errors", 0); /// Utilisation de la bibliothèque NuSOAP require_once ("nusoap.php"); /// Implémentation d une méthode du service function nom_operation($param1, $param2,...) { return $result; /// Création du service SOAP $serverws = new soap_server(); /// Configuration et génération du fichier WSDL $serverws->configurewsdl('nom_service', 'url_localisation_service'); $serverws->wsdl->schematargetnamespace="url_localisation_service?wsdl"; /// Enregistrement d une méthode $serverws->register('nom_operation', array('paramin1' => 'xsd:type_paramin1',...), array('paramout' => 'xsd:type_paramout'), 'url_localisation_service', 'literal', 'une description textuelle de la méthode'); /// Lancement du processus serveur $HTTP_RAW_POST_DATA = isset($http_raw_post_data)? $HTTP_RAW_POST_DATA : ''; $serverws->service($http_raw_post_data); exit();
Annexe 3 : formulaire représentant l IHM d une calculatrice <html> <head><title>calculatrice</title></head> <body> /// Initialisation des variables $nb1 = ''; $nb2 = ''; $resultat = ''; /// Cas où le formulaire a été validé par l'utilisateur if (isset($_post['op']) && (!empty($_post['op']))) { if (isset($_post['nb1']) && (!empty($_post['nb1'])) && isset($_post['nb2']) && (!empty($_post['nb2']))) { $nb1 = htmlentities($_post['nb1']); $nb2 = htmlentities($_post['nb2']); switch (htmlentities($_post['op'])) { case "Additionner" : case "Soustraire" : case "Multiplier" : default : <!-- Affichage du formulaire --> <form action=" echo $_SERVER['PHP_SELF']; " method="post"> <fieldset><legend><b>calculatrice en ligne</b></legend> Nombre 1<input type="text" name="nb1" value=" echo $nb1; "/><br/> Nombre 2<input type="text" name="nb2" value=" echo $nb2; "/><br/> Résultat<input disabled="disabled" type="text" value=" echo $resultat; "/><br/> <input type="submit" name="op" value="additionner"/> <input type="submit" name="op" value="soustraire"/> <input type="submit" name="op" value="multiplier"/> <input type="submit" name="op" value="diviser"/> <input type="reset" value="vider"/> </fieldset> </form> </body> </html>