Struttura SOAP

Vi parliamo adesso in questo tutorial del protocollo SOAP. Acronimo di Simple Object Access Protocol. Ha il preciso scopo di permettere l’interscambio di dati tramite il web secondo uno specifico protocollo fra software residenti in server remoti. Tipicamente hosting.

SOAP opera in differenti protocolli di rete, ad oggi comunque utilizza quasi esclusivamente http e htttps ed è bastato sul linguaggio XML. In questa prima lezione vi spiegheremo cosa sia SOAP e WSDL . Nella seguente lezione vi spiegheremo come metterlo in pratica con il linguaggio di programmazione PHP.

La struttura del SOAP si suddivide in due parti

Header opzionale per le informazioni riguardanti parametri di sicurezza e informazioni sulle transazioni

Body nel quale è presente il contenuto informativo secondo uno schema XML Schema

I messaggi SOAP sono incapsulati e spediti fra due server remoti tramite un Web Service secondo il seguete schema del framework SOAP

  • Initial SOAP sender – è il nodo che genera il messaggio;
  • SOAP sender – spedisce i messaggi SOAP;
  • SOAP intermediary – procetta l’header del messaggio Body per poi inviarlo al receiver
  • SOAP receiver – Riceve i messaggi SOAP.
  • Ultimate SOAP receiver – Il Destinatario finale

Struttura SOAP

Facciamo subito un esempio dove interroghiamo il server remoto CelsiusToFahrenheit presso l’host w3schools.com.

Un possibile esempio di

POST /webservices/tempconvert.asmx HTTP/1.1
Host: www.w3schools.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.w3schools.com/webservices/CelsiusToFahrenheit"

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<ns1:getTemp xmlns:ns1="urn:xmethods-Temperature"
SOAP-ENV:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/">
<zipcode xsi:type="xsd:string">10016</zipcode>
</ns1:getTemp>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

e la risposta del server medesimo dove fra … il messaggio ricevuto in base all’interrogazione. Ovviamente nell’intestazione della risposta il codice 200 OK ad indicare che l’operazione è andata a buon fine.

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<ns1:getTempResponse xmlns:ns1="urn:xmethods-Temperature"
SOAP-ENV:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:float">71.0</return>
</ns1:getTempResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ma quali sono le operazioni permesse dal Web Service  entra in gioco il WSDL

A questo domanda risponde il WSDL acronimo di Web Services Description Language che indica in maniera astratta

  • le “operazioni” che il Web Service puo’ compiere Il suo utilizzo ossia protocollo di comunicazione ad esempio http, formato dei messaggi accettati in input e restituiti in output dal servizio ed i dati correlati e in vincoli del servizio (bindings);
  • L’endpoint ossia dove il servizio stesso risiede in formato URI .

Utilizza come linguaggio strutturato un mix di XML e SOAP

Attualmente il formato WSDL ufficiale è il 2.0.

Nello specifico il linguaggio WSDL è cosi’ descritto

<?xml ... ?> nella quale è racchiusa la definizione per la versione di xml utilizzata.
<wsdl:definitions ... > - che dichiara invece la versione di WSDL
<wsdl:types>... </wsdl:types> - definizione dei tipi di dato utilizzati
<message> ... </message> - per i messaggi incapsulati
<portType> ... </portType> - per le porte utilizzate
<binding> ... </binding> - indica le associazione tra operazioni e trasporto eseguite
<service> ... </service> - definisce il trasporto WSDL

Questi parametri sono obbligatori e servono a fare comprendere a chi si deve interfacciare con questo servizio i parametri SOAP che il servizio permette. Detto questo vediamo un esempio abbastanza esaustivo

<?xml version="1.0" encoding="UTF-8"?>
<definitions name = "HelloService"
 targetNamespace = "http://www.examples.com/wsdl/HelloService.wsdl"
 xmlns = "http://schemas.xmlsoap.org/wsdl/"
 xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:tns = "http://www.examples.com/wsdl/HelloService.wsdl"
 xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
 
 <message name = "SayHelloRequest">
 <part name = "firstName" type = "xsd:string"/>
 </message>
 
 <message name = "SayHelloResponse">
 <part name = "greeting" type = "xsd:string"/>
 </message>

<portType name = "Hello_PortType">
 <operation name = "sayHello">
 <input message = "tns:SayHelloRequest"/>
 <output message = "tns:SayHelloResponse"/>
 </operation>
 </portType>

<binding name = "Hello_Binding" type = "tns:Hello_PortType">
 <soap:binding style = "rpc"
 transport = "http://schemas.xmlsoap.org/soap/http"/>
 <operation name = "sayHello">
 <soap:operation soapAction = "sayHello"/>
 <input>
 <soap:body
 encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
 namespace = "urn:examples:helloservice"
 use = "encoded"/>
 </input>
 
 <output>
 <soap:body
 encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
 namespace = "urn:examples:helloservice"
 use = "encoded"/>
 </output>
 </operation>
 </binding>

<service name = "Hello_Service">
 <documentation>WSDL File for HelloService</documentation>
 <port binding = "tns:Hello_Binding" name = "Hello_Port">
 <soap:address
 location = "http://www.examples.com/SayHello/" />
 </port>
 </service>
</definitions>

dove abbiamo riportato un pò tutte le voci