PHP SOAP
SOAP server
Een soap server maken is het makkelijkst door gebruik te maken van Zend objecten. Als je objecten als parameters gebruikt in je methods, in de server, dan krijg je ze altijd binnen als stdClass object. Volgens mij kan dit niet anders, en misschien zou dit ook gek zijn, anders kunnen mensen allerlei objecten in je server duwen. Aan de client kun je wel gebruik maken van object mapping. Je weet aan de hand van de wdsl wat er terug gegeven wordt door de server, dus dit kun je mappen aan je eigen objecten.
Om je soap server te laten afhandelen door een object kun je dit stukje standaard code gebruiken, wat gebruik maakt van Zend.
ini_set('soap.wsdl_cache_enabled', '0');
include_once 'Zend/Loader/Autoloader.php'; $loader = Zend_Loader_Autoloader::getInstance(); $loader->setFallbackAutoloader(true); $loader->suppressNotFoundWarnings(false);
require_once "Zend/Soap/Server.php"; require_once "Zend/Soap/AutoDiscover.php";
if(isset($_GET['wsdl'])) {
$autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex'); $autodiscover->setClass('TestService'); $autodiscover->handle();
} else {
$soap = new Zend_Soap_Server("http://soapserver.local/tstSoapServer.php?wsdl"); // this current file here $soap->setClass('TestService'); $soap->handle();
}
Hieronder kun je dan je class definieren, of dit includeren.
Client
Een client is dan ook heel simpel aan te maken. Voorbeeldje met class mapping. Als je de class Group hebt gedefinieerd voor het laden van de SOAP Client dan zal de var $group dus van het type Group zijn. Client side kun je e.e.a. dus wel meteen aan je models hangen.
$client = new SoapClient("http://soapserver.local/tstSoapServer.php?wsdl", array("classmap" => array("Person" => "Person", "Group" => "Group")));
$group = $client->getGroup();