Web Service, SOAP e PHP 5

Questo tutorial realizza una piattaforma che mette in relazione Web Service, SOAP e PHP 5. L’articolo nasce come supporto ad una guida di Giacomo Masseroni realizzata su html.it al seguente link, facilitandone alcuni punti. In prima battuta vediamo un pò il funzionamento dei messaggi soap su una piattaforma sviluppata in PHP 5.
Il PHP dalla versione 5 supporta le versioni SOAP 1.1 e 1.2 e la versione WSDL 1.1.
In particolare è stata introdotta la classe SoapServer che permette di creare un oggetto per un Web service SOAP.
La classe ha la funzione addFunction che permette di aggiungere una funzione all’oggetto SoapServer, e quindi al Web service stesso. E la funzione setClass che setta la classe che gestirà le richieste SOAP.
L’esempio di Web service realizzato dal Sig.Masseroni creerà un servizio che permette all’utente di chiedere l’indirizzo internet di un motore di ricerca.

soapServer

Utilizzo di PHP come linguaggio del SOA


Un web service è un software disegnato per l’implementazione e il supporto dell’interoperabilità e interazione delle macchine che hanno accesso ad una stessa rete. Esistono diversi tipi di web service, in questo tutorial verranno utilizzati i web services di tipo SOAP.
Per farvi un’idea di come è strutturato un messaggio SOAP vi invito a consultare il seguente link.
I Web Services hanno un’interfaccia descritta da un particolare formato creato per essere facilmente leggibile dalle macchine. Questo formato è il WSDL(Web Service Definition Language). Il WSDL definisce un formato XML per descrivere i servizi di una specifica rete come un insieme di punti terminali operanti su messaggi che contengono informazioni di tipo “documentali” o “strutturate“.
Esso viene utilizzato per permettere ai client che vogliono consumare il Web service di conoscere tutte le caratteristiche del Web service stesso.
livello astratto e livello concreto del WSDL

Livelli su cui è strutturato il WSDL.

Il WSDL agisce su due livelli:

  • LIVELLO ASTRATTO, operazioni offerte e messaggi scambiati.
  • LIVELLO CONCRETO, implementazione reale del livello astratto.

La descrizione astratta prevede:

  • MESSAGGI
  • OPERAZIONI
  • PORTE ASTRATTE

La descrizione concreta prevede:

  • BINDING
  • PORTE
  • SERVIZI

TYPES
Ogni messaggio scambiato nell’ambito delle operazioni del WSDL deve essere tipato. I tipi sono inseriti nell’elemento types. Si possono creare anche tipi di dato complessi che contengono elementi di tipo atomico (interi, stringhe, ecc.).
MESSAGE
I messaggi seguono la sezione types, essendo la base della costruzione del web service.
OPERATION
Il WSDL definisce quattro tipologie di operazioni:

  • ONE-WAY (operazione asincrona), client invia un messaggio.
  • REQUEST-RESPONSE (operazione sincrona), client invia un messaggio ed il server risponde.
  • NOTIFICATION (operazione asincrona), server invia una notifica al client.
  • SOLICIT-RESPONSE (operazione sincrona), server invia notifica al client il quale risponde.

PORT TYPE
L’insieme delle operazioni vengono riepilogate nel portType. Ogni porta astratta è composta da un insieme di operation che rappresentano le operazioni assocciate a suddetta porta.
Esso è l’elemento più importante del WSDL.
BINDING
E’ l’implementazione della porta astratta. Le binding servono a descrivere come costruire un messaggio SOAP a partire dal messaggio astratto definito nel WSDL, definendone il protocollo.
PORT
Una porta è l’istanza di una porta astratta ottenuta tramite il binding.
SERVICE
Le porte non sono dichiarate globalmente bensì si trovano all’interno dei servizi. Il service è l’elemento di più alto livello del WSDL. Esso dischiara il servizio web come raccoglitore di porte.


Dopo queste digressioni teoriche è opportuno tornare al tutorial pratico vero e proprio.
Per realizzare tale tutorial in locale è necessario aver installato un web server sul nostro pc, personalmente utilizzo e consiglio WAMP Server che potete reperire su sourceforge.
I STEP: Creazione cartelle
A questo punto create nella cartella dei sorgenti una cartella dove avremo tutti i file di questo tutorial (chiamata soap nel mio progetto). All’interno di questa creo una cartella per il server ed una per il client, esse sono state rispettivamente chiamate base_server e base_client.
II STEP: Creazione del web services
Il server ospiterà il web service, ossia il file WSDL.

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:tns="http://www.html.it/php_ws_soap" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" 
     targetNamespace="http://www.html.it/php_ws_soap">
	<types>
		<xs:schema targetNamespace="http://www.html.it/php_ws_soap">
			<xs:element name="name" type="xs:string"/>
			<xs:element name="weburl" type="xs:string"/>
		</xs:schema>
	</types>
	<message name="getWebUrl">
		<part name="name" type="xs:string"/>
	</message>
	<message name="returnWebUrl">
		<part name="weburl" type="xs:string"/>
	</message>
	<portType name="WebServiceTest">
		<operation name="getWebUrl">
			<input message="tns:getWebUrl"/>
			<output message="tns:returnWebUrl"/>
		</operation>
	</portType>
	<binding name="WebServiceSOAPBinding" type="tns:WebServiceTest">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http" type="rpc"/>
		<operation name="getWebUrl">
                        <!-- Localizzazione del service deployato sul server. -->
			<soap:operation 
                             soapAction="http://localhost/soap/base_server/server.php/getWebUrl"/>
			<input>
				<soap:body use="encoded" 
                                     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
                                     namespace="http://www.html.it/php_ws_soap"/>
			</input>
			<output>
				<soap:body use="encoded" 
                                     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
                                     namespace="http://www.html.it/php_ws_soap"/>
			</output>
		</operation>
	</binding>
	<service name="GetWebUrl">
		<port name="WebUrl" binding="tns:WebServiceSOAPBinding">
			<soap:address location="http://localhost/soap/base_server/server.php"/>
		</port>
	</service>
</definitions>

Salve questo file con il nome search_engine.wsdl, depositandolo nella cartella del server (base_server). Modificare in questo file l’url http://localhost/soap/base_server/server.php/getWebUrl situata alla riga 25 e l’url http://localhost/soap/base_server/server.php alla riga 36. Vi consiglio anche di aver un buon editor XML/XSD/WSDL/… sul vostro computer personalmente utilizzo Altova XMLSpy.
III STEP: Creazione del server

 
// Con public ottengo errore in PHP protected è senza nulla.
class SearchEngineWS {
 
	function getWebUrl($name){
	 	echo($name."<br>");
	    $engines = array(
	        'google'    => 'www.google.it',
	        'yahoo' => 'www.yahoo.it'
	    );
	    return $engines[$name] ? $engines[$name] : "Search Engine unknown";
	}
 
}
/* OPZIONALMENTE: Definire la versione del messaggio soap. Il secondo parametro non è obbligatorio. */
$server= new SoapServer("search_engine.wsdl", array('soap_version' => SOAP_1_2));
//$server=new SoapServer("search_engine.wsdl");
 $server->setClass("SearchEngineWS");
// Infine la funzione handle processa una richiesta SOAP e manda un messaggio di ritorno 
// al client che l’ha richiesta.
$server->handle();

Ho nominato questo file server.php tale file come è facile intuire viene ripreso nel WSDL, quindi fate molta attenzione ad i nomi che attribuite scovare errori in un secondo momento nel WSDL non è molto semplice se già validato dall’editor WSDL.
IV STEP: Creazione del client
Spostiamoci infine nella cartella realtiva al client, tale file è stato chiamato client_web_service.php.

 
/**
* Client che chiede al Web service l’indirizzo internet di un motore di ricerca. 
* PHP 5 mette a disposizione l’oggetto SoapClient per definire un client.
*/
// Se chiamiamo questo file in un browser otteniamo come risposta: www.google.it.
try {
	$gsearch = new SoapClient('http://localhost/soap/base_server/search_engine.wsdl');
	echo("SOAP Client creato con successo!<br>");
	$result=$gsearch->getWebUrl('google');
	echo("Servizio Disponibile<br>");
	print_r("Stampa del risultato: ".$result." <br>");
} catch (SoapFault $exception) {
	print_r($exception);
}

Anche quì dovete modificare l’url http://localhost/soap/base_server/search_engine.wsdl se diversa da quella utilizzata nel tutorial.
Se tutto è andato a buon fine otterrete il seguente output.

output web service

Output finale del tutorial WSDL, PHP 5

Nel prossimo tutorial mostremo come effettuare il dubugging del client per i web service SOAP appena realizzati.

Web Service, SOAP e PHP 5 ultima modidfica: 2014-12-30T10:03:15+01:00 da Gianluca Di Vincenzo
Posted in: PHP, SOA

By on 30 Dicembre 2014

Tagged: , , , , ,