Simple Object Access Protocol (SOAP) est un protocole qui permet d’échanger des messages à distance.
Ce protocole peut être utilisé pour créer ou appeler des Web Services via HTTP.
Sa structure est décrite au format XML.
Exemple d’utilisation de SOAP avec Zend Framework
Voici un exemple simple d’utilisation de SOAP, avec la partie côté serveur, et côté client.
Côté serveur
Tout d’abord, installer si ce n’est pas déjà le cas, le paquet php-soap : apt-get install php-soap
.
Ensuite, dans un projet Zend, créer un controller SoapController
, avec une fonction wsdlAction
qui va générer le fichier WSDL (xml).
Le fichier WSDL sert à décrire notre service web, on lui précise donc la classe qu’il devra décrire.
class SoapController extends Zend_Controller_Action
{
public function init()
{
Zend_Layout::getMvcInstance()->disableLayout();
Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);
}
public function indexAction()
{
$soapServer = new Zend_Soap_Server(
'http://www.mon-serveur.fr/soap/wsdl/',
array(
'soap_version' => SOAP_1_1,
'encoding' => 'UTF-8'
)
);
$soapServer->setPersistence(SOAP_PERSISTENCE_SESSION);
$soapServer->setClass('Soap_User');
$soapServer->handle();
}
public function wsdlAction()
{
$wsdl = new Zend_Soap_AutoDiscover();
$wsdl->setClass('Soap_User');
$wsdl->setUri('http://www.mon-serveur.fr/soap/');
$wsdl->handle();
}
}
Maintenant il faut écrire notre classe Soap_User
en précisant bien les paramètres en entrée et la valeur en sortie.
class Soap_User
{
/**
* Retourne un utilisateur
*
* @param integer $idUser
* @return array
*/
public function getUser($idUser)
{
$tableUser = new Table_User();
return $tableUser->fetchRow(
$tableUser->select()->where('idUser = ?', $idUser)
)->toArray();
}
}
Côté client
On commence par préciser qu’on ne veut pas utiliser le cache WSDL (à faire pendant la période de test).
ini_set('soap.wsdl_cache_enabled', '0');
Ensuite, dans un controller quelconque, on va utiliser le service web créer plus haut.
On créer un objet Zend_Soap_Client
en lui précisant l’adresse du fichier WSDL, et un tableau d’options.
$optionsSoap = array(
'soap_version' => SOAP_1_1,
'encoding' => 'UTF-8',
'compression' => SOAP_COMPRESSION_ACCEPT
);
$soapClient = new Zend_Soap_Client('http://www.mon-serveur.fr/soap/wsdl/', $optionsSoap);
Maintenant, on peut facilement faire appel à la fonction qui permet de récupérer un utilisateur :
try {
$user = $soapClient->getUser(3);
} catch (Soap_Fault $e) {
var_dump($e);
}
Si vous ne voulez pas télécharger le fichier xml à chaque appel, vous pouvez réactiver le cache et également préciser un dossier et une durée de vie :
ini_set('soap.wsdl_cache_enabled', '1');
ini_set('soap.wsdl_cache_dir', '/tmp');
ini_set('soap.wsdl_cache_ttl', 86400);
SoapUI
Pour tester votre WS, vous pouvez utiliser SoapUI.
Le logiciel permet de tester plusieurs services web, il suffit de préciser l’adresse d’un fichier WSDL, et de rentrer des données à la main (dans notre cas un identifiant utilisateur), le résultat vous sera affiché.