Programmation PHP/Exemples/Webservice

Introduction

modifier

Le langage XML se propage peu à peu dans le système d'information. Il est devenu nécessaire de connaître ce standard. Il permet de développer des applications sous plateforme JEE, .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) ?

modifier

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

modifier

Utilisation de la bibliothèque NuSOAP

modifier

Pour mettre en place un service web utilisant le protocole SOAP sous technologie PHP, il vous faut récupérer la bibliothèque NUSOAP sous licence GNU en PHP4. La bibliothèque 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 bibliothèque 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

modifier

Une fois la bibliothèque téléchargée et placée dans un sous répertoire où va se trouver votre fichier webservice, nous allons pouvoir commencer à 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 bibliothèque nécessaire 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

modifier

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 chaîne 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 chaîne 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

modifier

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

<?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>

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;
}
?>
<?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');

// exécuter la méthode getHello
echo $clientSOAP->getHello('Marc','Assin');

?>

Conclusion

modifier

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

modifier