L'elemento Body è senza dubbio il più interessante: contiene il messaggio che sarà consegnato al destinatario.
All'intero di Body
ogni elemento deve essere definito da un namespace poiché SOAP prevede al suo interno solamente un elemento predefinito: Fault
. Gli elementi che si trovano all'interno del messaggio Body
sono quelli definiti da noi (vedi l'esempio di WSDL), ci permettono di inviare i parametri e ricevere le risposte dalle operazioni che abbiamo previsto per il nostro Web service.
Facciamo un esempio simulando la richiesta dell'utente #24:
<?xml version="1.0" encoding="utf-8" ?> <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body xmlns:tns="https://www.html.it/guida_ai_Web services"> <tns:getUserById SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/envelope/"> <id xsi:type="xsd:integer">24</id> </tns:getUserById> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Come si può vedere dall'esempio, all'interno di Envelope
, abbiamo "caricato" tre namespace, uno per l'istanza di XMLSchema, uno per XMLSchema ed uno per SOAP. Questi namespace servono principalmente per descrivere il documento.
Il namespace più interessante da notare è definito con il tag Body
. Abbiamo infatti inserito lì il nostro namespace (quello a cui abbiamo collegato i nostri tipi personalizzati tramite WSDL). Grazie a questo namespace, una volta che il messaggio è a destinazione, il Web service saprà decodificare gli elementi che trasporta il messaggio SOAP (lo stesso accade all'inverso quando il Web service risponde).
Abbiamo detto che all'interno del <Body>
risiedono i messaggi inviati e questa parte dell'esempio precedente ci fa capire come:
<tns:getUserById SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/envelope/"> <id xsi:type="xsd:integer">24</id> </tns:getUserById>
Non trovate che abbia qualcosa in comune alcune parti del WSDL che abbiamo definito nel capito precedente? Rivediamo quel codice:
<message name="get_userRequest">
<part name="id" type="xs:integer" />
</message>
....
<portType name="gestioneUtentiType">
<operation name="getUserById">
<input message="tns:get_userRequest" />
<output message="tns:get_userResponse" />
</operation>
...
</portType>
Certo che c'è qualcosa in comune!
Il messaggio SOAP che abbiamo visto come esempio è infatti realizzato per sfruttare l'operazione getUserById
descritta dal nostro WSDL ed evidenziata in rosso. Per specificarlo abbiamo inserito all'interno del Body un tag con namespace tns
(definito nel nostro WSDL) di nome getUserById
.
All'interno di questo elemento abbiamo poi inserito ciò che l'operazione si aspetta di ricevere in input: un elemento di tipo intero chiamato id.