Quindi vediamo adesso come implementare un protocollo SOAP con WSDL utilizzando il PHP.

Avremo bisogno dei seguenti requisiti sul nostro PC o Hosting che sia.

Ossia la versione 7 del PHP o superiore e il framework zend soap.

Analizziamo entrambi. Il primo ovviamente è la versione del linguaggio superiore alla 7 , magari in seguito ci torneremo un attimo sopra, ma per il momento non ci occorrono altre spiegazioni. Probabilmente in qualche lezione di approfondimento.

Mentre zend soap altro non è che un potente framework per realizzare web service realizzato appunto dalla società zend . Ovviamente realizzano delle librerie che permettono di costruire con dei semplici passaggi il tutto. Noi in questo caso utilizzeremo le librerie con il composer. Se non sapete come si fa leggete in fondo in appendice, oppure nel sito on line Composer . Quindi procediamo

Installiamo la libreria con il comando

composer require zendframework/zend-soap

A questo punto creiamo un SOAP end point chiamato server.php

 

<?php

require_once __DIR__ . '/vendor/autoload.php'; //richiamo alle librerie ZEND create con il comando composer.

class Hello
{
 /**
 * Say hello.
 *
 * @param string $firstName
 * @return string $greetings
 */
 public function sayHello($firstName)
 {
 return 'Hello ' . $firstName;
 }

}

$serverUrl = "http://localhost/hello/server.php";
$options = [
 'uri' => $serverUrl,
];
$server = new Zend\Soap\Server(null, $options);

if (isset($_GET['wsdl'])) {
 $soapAutoDiscover = new \Zend\Soap\AutoDiscover(new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence());
 $soapAutoDiscover->setBindingStyle(array('style' => 'document'));
 $soapAutoDiscover->setOperationBodyStyle(array('use' => 'literal'));
 $soapAutoDiscover->setClass('Hello');
 $soapAutoDiscover->setUri($serverUrl);

header("Content-Type: text/xml");
 echo $soapAutoDiscover->generate()->toXml();
} else {
 $soap = new \Zend\Soap\Server($serverUrl . '?wsdl');
 $soap->setObject(new \Zend\Soap\Server\DocumentLiteralWrapper(new Hello()));
 $soap->handle();
}

Questo file non crea solamente il protocollo SOAP ma anche il linguaggio WSDL che descrive il servizio. Chiunque voglia sapere che cosa fa il vostro webservice potrà controllare il relativo file wsdl presso

http://localhost/hello/server.php?wsdl

A questo punto dobbiamo creare il client. Per semplicità il tutto verrà tenuto nello stesso computer. In un caso reale il server.php si trova nel web server in remoto , mentre il client.php è nel nostro computer utente che interroga il server in remoto e per sapere cosa fa il server in remoto si legge il file wsdl di cui sopra. Quindi avremo.

<?php

require_once __DIR__ . '/vendor/autoload.php';

$client = new Zend\Soap\Client('http://localhost/hello/server.php?wsdl');
$result = $client->sayHello(['firstName' => 'World']);

echo $result->sayHelloResult;

E la risposta che otterremo è la seguente

Hello World

E’ possibile che otteniate un fatal error. Dipende da una possibile incompatibilità fra la libreria di Zend Framework e PHP 7. Probabilmente al momento in cui state leggendo già risolta. Per ogni buon conto sostituite

$result = $client->sayHello(['firstName' => 'World']);

con

$result = $client->call('sayHello', [['firstName' => 'World']]);

Ovviamente questo non è un esempio esaustivo ma credo che renda molto bene l’idea di come funziona il tutto.