Web Service SOAP con PHP, in 5 passi usando NuSOAP!

Prima o poi capita a tutti i programmatori di dover far interagire la propria applicazione web con qualche altro sistema ( … io penso sempre a SAP ūüėÄ ¬†) . Il metodo classico di interazione √® quello di utilizzare dei web service.

In questo articolo vediamo come realizzare web service SOAP in PHP.

PHP prevede gi√† una estensione SOAP standard che per√≤ prevede la configurazione del modulo PHP dell’Apache sul quale gira, cosa che non sempre √® fattibile ( per varie ragioni ). La soluzione √® quindi quella di utilizzare una libreria esterna, NuSOAP, che consente di creare ed interrogare Web Service velocemente e senza dover smanettare troppo sulle configurazioni di Apache o sul file .ini di PHP.

Primo passo: scarica NuSOAP

Scarica la libreria da¬†https://sourceforge.net/projects/nusoap/ ¬†e copia la cartella all’interno della root principale del tuo sito ( accessibile con le istruzioni include o require_once )

 

Secondo passo: creare il Server Soap

<?php
require_once "lib/nusoap.php"; // richiamiamo la libreria NuSOAP
 
class food {
 
 public function getFood($type) {   // creiamo la funzione getFood
 switch ($type) {
 case 'starter':
 return 'Soup';
 break;
 case 'Main':
 return 'Curry';
 break;
 case 'Desert':
 return 'Ice Cream';
 break;
 default:
 break;
 }
 }
}
 /* inizializziamo la classe soap_server e configuriamo il WSDL */
$server = new soap_server();
$server->configureWSDL("foodservice", "http://www.greenacorn-websolutions.com/foodservice");
 
$server->register("food.getFood",
 array("type" => "xsd:string"),
 array("return" => "xsd:string"),
 "http://www.nomesito.com/foodservice",
 "http://www.nomesito.com/foodservice#getFood",
 "document",
 "encoded",
 "Get food by type");
 
@$server->service($HTTP_RAW_POST_DATA);

Creiamo un file di nome food.php con il codice visto sopra.

Qui possiamo osservare:

  • food.getFood¬†¬†che √® il¬†className.methodName
  • array(‚Äútype‚ÄĚ => ‚Äúxsd:string‚ÄĚ)¬†definisce l’imput per¬†getFood¬†e la sua tipologia di dati¬†i.e string, number, boolean
  • array(‚Äúreturn‚ÄĚ => ‚Äúxsd:string‚ÄĚ) definisce valore e metodo di ritorno
  • http://www.nomesito.com/foodservice¬†definisce il namespace.
  • http://www.nomesito.com/foodservice#getFood definisce l’azione¬†SOAP
  • document¬†defines il tipo di chiamata¬†(oppure rpc ma deprecato)
  • encoded definisce il valore dell’attibuto
  • L’ultimo parametro √® una stringa di documentazione che descrive ci√≤ che il metodo getFood fa

Terzo passo: il WSDL

Per vedere il risultato in XML basterà richiamare il WSDL (semplicemente richiamando il link al file food.php con il parametro  ?WSDL):

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.nomesito.com/foodservice" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.nomesito.com/foodservice">
 <types>
 <xsd:schema targetNamespace="http://www.nomesito.com/foodservice">
 <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
 <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
 </xsd:schema>
 </types>
 <message name="food.getFoodRequest">
 <part name="type" type="xsd:string" />
 </message>
 <message name="food.getFoodResponse">
 <part name="return" type="xsd:string" />
 </message>
 <portType name="foodservicePortType">
 <operation name="food.getFood">
 <documentation>Get food by type</documentation>
 <input message="tns:food.getFoodRequest"/>
 <output message="tns:food.getFoodResponse"/>
 </operation>
 </portType>
 <binding name="foodserviceBinding" type="tns:foodservicePortType">
 <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
 <operation name="food.getFood">
 <soap:operation soapAction="http://www.nomesito.com/foodservice#getFood" style="rpc"/>
 <input>
 <soap:body use="encoded" namespace="http://www.nomesito.com/foodservice" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
 </input>
 <output>
 <soap:body use="encoded" namespace="http://www.nomesito.com/foodservice" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
 </output>
 </operation>
 </binding>
 <service name="foodservice">
 <port name="foodservicePort" binding="tns:foodserviceBinding">
 <soap:address location="http://soap-test.dev/food.php"/>
 </port>
 </service>
</definitions>

Quarto passo: il client SOAP

<?php
require_once "lib/nusoap.php";
 
$client = new nusoap_client("food.wsdl", true);
$error = $client->getError();
 
if ($error) {
 echo "<h2>Constructor error</h2><pre>" . $error . "</pre>";
}
 
$result = $client->call("food.getFood", array("type" => "Main"));
 
if ($client->fault) {
 echo "<h2>Fault</h2><pre>";
 print_r($result);
 echo "</pre>";
} else {
 $error = $client->getError();
 if ($error) {
 echo "<h2>Error</h2><pre>" . $error . "</pre>";
 } else {
 echo "<h2>Main</h2>";
 echo $result;
 }
}
 
// show soap request and response
echo "<h2>Request</h2>";
echo "<pre>" . htmlspecialchars($client->request, ENT_QUOTES) . "</pre>";
echo "<h2>Response</h2>";
echo "<pre>" . htmlspecialchars($client->response, ENT_QUOTES) . "</pre>";
?>

Salviamo questo codice con il nome di foodclient.php ed osserviamo che:

Il nusoap_client viene inizzializzato per fargli accettare un file WSDL. Si potrebbe anche definire cos√¨:¬†$client = new nusoap_client(‚Äúhttp://soap-test.dev/food.php‚ÄĚ);¬†tuttavia, utilizzando un file WSDL √® considerato¬†“best practice” il primo metodo..
Il metodo getError controlla se il ritorno √® di tipo “errore”.
La chiamata al metodo definisce lo style “document”, gli argomenti e invia la richiesta SOAP.
Gli errori vengono di nuovo controllati ed i risultati vengono restituiti.
Le ultime righe di codice vengono utilizzati per mostrare sia la richiesta fatta che la risposta SOAP ricevuta.

Quinto passo: test

Il codice sopra riportato dovrebbe funzionare senza problema con connessioni https con certificato Self-Signed perché NuSOAP si occupa in autonomia di richiedere il certificato e aprire la connessione https.

0 comments on “Web Service SOAP con PHP, in 5 passi usando NuSOAP!Add yours →

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *