Il protocollo SOAP è utilizzato per scambiare informazioni tra software. Nasce come acronimo di Simple Object Access Protocol, poi rimosso dalla versione 1.2 dal W3C. Un messaggio scambiato tra client e server attraverso SOAP è basato su XML, come possiamo vedere dal seguente esempio:
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<m:reservation xmlns:m="http://travelcompany.example.org/reservation"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
<m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime>
</m:reservation>
<n:passenger xmlns:n="http://mycompany.example.com/employees"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<n:name>Åke Jógvan Øyvind</n:name>
</n:passenger>
</env:Header>
<env:Body>
<p:itinerary
xmlns:p="http://travelcompany.example.org/reservation/travel">
<p:departure>
<p:departing>New York</p:departing>
<p:arriving>Los Angeles</p:arriving>
<p:departureDate>2001-12-14</p:departureDate>
<p:departureTime>late afternoon</p:departureTime>
<p:seatPreference>aisle</p:seatPreference>
</p:departure>
<p:return>
<p:departing>Los Angeles</p:departing>
<p:arriving>New York</p:arriving>
<p:departureDate>2001-12-20</p:departureDate>
<p:departureTime>mid-morning</p:departureTime>
<p:seatPreference/>
</p:return>
</p:itinerary>
<q:lodging
xmlns:q="http://travelcompany.example.org/reservation/hotels">
<q:preference>none</q:preference>
</q:lodging>
</env:Body>
</env:Envelope>
Possiamo notare che il messaggio è costituito da un body e ad un header wrappati all'interno di un tag env:Envelope
. L'envelope è il nodo root di ogni messaggio SOAP. L'header è opzionale e, se usato, generalmente contiene informazioni aggiuntive utili per il destinatario. Il body, invece, contiene le informazioni necessarie per la comunicazione.
Nel caso del nostro esempio, essendo una prenotazione di un viaggio, il body contiene le informazioni sull'itinerario del viaggiatore mentre l'header altre informazioni come i dati del viaggiatore.
L'esempio è stato prelevato dalla documentazione ufficiale del W3C.
Descrizione dei servizi attraverso WSDL
Ogni Web Service che utilizza il protocollo SOAP mette a disposizione un URL pubblico che contiene la descrizione dei servizi disponibili. Tale interfaccia è basata sul protocollo WSDL:
<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
Analizzando l'esempio appena visto notiamo la presenza dei seguenti tag:
Tag | Descrizione |
---|---|
definitions |
L'elemento root che contiene il tutto. Definisce anche il nome del servizio. |
types |
Definisce tutti i tipi di dato che possono essere scambiati tra client e server. |
message |
Contiene i dati che possono essere scambiati tra client e server. Al suo interno definisce anche i parametri supportati e, per ogni parametro, il tipo di dato. |
portType |
Combina uno o più messaggi per determinare un'operazione da compiere attraverso il Web Service. |
binding |
Definisce come un'operazione portType viene trasmessa tra client e server. Determina il protocollo e la locazione del servizio necessario. |
service |
Contiene informazioni sul Web service come l'indirizzo a cui è disponibile lo stesso. |