< Programmation PHP < Exemples

Introduction

Le langage XML se propage peu à peu dans le système d'information. Il est devenu nécessaire de connaitre ce standard. Il permet de développer des applications sous plateforme J2EE, .Net ou PHP et de s'affranchir des problèmes de portabilité. Les webservices sont basés sur XML, permettant de créer des composants logiciels distribués, de les utiliser indépendamment du langage d'implémentation. SOAP, WSDL, UDDI et WS-Inspection sont les technologies standard qui rendent possibles la construction et la publication de ces services.

Dans nos exemples, nous aborderons l'utilisation de SOAP. Zend propose dans son framework quelques utilitaires de la technique SOAP et REST.

Qu'est-ce que SOAP (Simple Object Access Protocol) ?

Il s'agit d'un protocole d'échange permettant d'invoquer des applications sur différents types de réseaux, en faisant appel, à distance, à des méthodes. Il utilise différents protocoles de transport tel que HTTP mais aussi le protocole POP ou SMTP pour transmettre des données sous forme de messages.

SOAP repose sur une approche RPC (Remote Procedure Call), basée donc sur des messages dont le contenu est structuré en XML.

Webservice PHP4

Utilisation de la librairie NuSOAP

Pour mettre en place un service web utilisant le protocole SOAP sous technologie PHP, il vous faut récupérer la librairie NUSOAP sous license GNU en PHP4. La librairie a été développée par NuSphere et Dietrich Ayala. elle permet de créer des services web basés sur SOAP 1.1, WSDL 1.1 et HTTP 1.0/1.1.

Vous pouvez la télécharger sur le site suivant: http://sourceforge.net/projects/nusoap/

L'utilisation de cette librairie ne nécessite pas la mise en place d'extensions PHP spécifiques ce qui est un avantage pour la mise en place de ce système.

Mise en place du webservice

Une fois la librairie téléchargée, et placée dans un sous répertoire où va se trouver votre fichier webservice, nous allons pouvoir commencer a voir comment créer votre webservice.

Vous devez créer un fichier pour votre webservice, nous allons le nommer par exemple webservice.php.

<?php

  //on inclut la librairie necessaire pour mettre en place le webservice
  require_once("lib/nusoap.php"); 
  //on initialise un nouvel objet serveur 
  $server = new soap_server();
  // on configure en donnant un nom et un Namespace 
  $server -> configureWSDL('nomDuWebservice','Namespace'); 
  //on spécifie l'emplacement du namespace
  $server -> wsdl->schemaTargetNamespace = 'http://emplacementDuNamespace';

?>

Votre webservice est créé, il vous faut maintenant ajouter des méthodes, et le faire communiquer avec les différents clients.

Création des méthodes

Nous allons voir ici comment ajouter des méthodes dans votre webservice en prenant un exemple simple. Nous allons créer une méthode qui prend en argument une chaine de caractères et qui la renvoie.

Dans votre fichier webservice.php, à la suite du code déjà écrit, nous allons rajouter les lignes suivantes :

<?php

  //on enregistre la méthode grâce à register()
  $server->register('ReturnChaine',array('ChaineString'=>'xsd:string'),   
  array('return'=>'xsd:string'),'Namespace');

  //nous créons ici la fonction ReturnChaine() qui correspond à la méthode créée
  function ReturnChaine($ChaineString) {
     return new soapval('return','string',$ChaineString);   
  }

  $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
  $server->service($HTTP_RAW_POST_DATA);

?>

Nous avons vu dans cet exemple comment retourner une chaine de caractère, un exemple assez simple. Il est aussi possible de renvoyer des tableaux grâce aux méthodes lorsqu'on souhaite extraire des éléments d'une base de données.

Webservice PHP5

On utilise ici la bibliothèque SOAP[1].

WSDL

<?xml version="1.0"?>
<!-- partie 1 : Definitions -->
<definitions 	name="HelloYou" 
		targetNamespace="urn:HelloYou" 
		xmlns:typens="urn:HelloYou" 
		xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
		xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
		xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
		xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
		xmlns="http://schemas.xmlsoap.org/wsdl/">
		
	<!-- partie 2 : Types-->
<types>
    	<xsd:schema 	xmlns="http://www.w3.org/2001/XMLSchema" 
			targetNamespace="urn:HelloYou">
 	</xsd:schema>
 </types> 
	
	
	<!-- partie 3 : Message -->
	<message name="getHelloRequest">
		<part name="prenom" type="xsd:string"/>
		<part name="nom" type="xsd:string"/>
	</message>
	<message name="getHelloResponse">
		<part name="return" type="xsd:string"/>
	</message>
	
	<!-- partie 4 : Port Type -->
	<portType name="HelloYouPort">
		<!-- partie 5 : Operation -->
		<operation name="getHello">
			<input message="typens:getHelloRequest"/>
			<output message="typens:getHelloResponse"/>
		</operation>
	</portType>

	<!-- partie 6 : Binding -->
	<binding name="HelloYouBinding" type="typens:HelloYouPort">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="getHello">
			<soap:operation soapAction="HelloYouAction"/>
			<input name="getHelloRequest">
				<soap:body 	use="encoded" 	
						namespace="urn:HelloYou" 	
						encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output name="getHelloResponse">
				<soap:body 	use="encoded" 	
						namespace="urn:HelloYou" 
						encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
	</binding>

	<!-- partie 7 : Service -->
	<service name="HelloYouService">
		<documentation>Retourne une phrase simple </documentation>
		<!-- partie 8 : Port -->
		<port name="HelloYouPort" binding="typens:HelloYouBinding">
			<soap:address location="http://monDns:monPort/monChemin/server.php"/> <!-- modifier ce chemin vers server.php -->
		</port>
	</service>
</definitions>

SERVER

Pour que soap soit actif, il faut décommenter extension=php_soap.dll dans php.ini


<?php

// première étape : désactiver le cache lors de la phase de test
ini_set("soap.wsdl_cache_enabled", "0");

// on indique au serveur à quel fichier de description il est lié
$serveurSOAP = new SoapServer('HelloYou.wsdl');

// ajouter la fonction getHello au serveur
$serveurSOAP->addFunction('getHello');

// lancer le serveur
if ($_SERVER['REQUEST_METHOD'] == 'POST')

{
	$serveurSOAP->handle();
}
else
{
	echo 'désolé, je ne comprends pas les requêtes GET, veuillez seulement utiliser POST';
}

function getHello($prenom, $nom)
{
	return 'Hello ' . $prenom . ' ' . $nom;
}
?>

Client

<?php

// première étape : désactiver le cache lors de la phase de test
ini_set("soap.wsdl_cache_enabled", "0");

// lier le client au fichier WSDL
$clientSOAP = new SoapClient('HelloYou.wsdl');

// executer la methode getHello
echo $clientSOAP->getHello('Marc','Assin');

?>

Conclusion

Nous avons pu voir dans cet article comment développer un webservice en PHP. Comme pour les autres technologies dans lesquelles sont développés les webservices, il est possible de construire des méthodes plus complexes,avec accès aux bases de données et un véritable traitement de l'information.

Références

Cet article est issu de Wikibooks. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.