Ora che abbiamo capito come funziona XML Schema possiamo finalmente addentrarci in un documento WSDL. Questo linguaggio serve a specificare dove si trovano i servizi e le operazioni esposte dal servizio web.
La struttura del documento WSDL
Cominciamo subito a vedere come un documento WSDL definisce un Web service. All'interno del documento esistono quattro elementi principali:
- <types>
- <message>
- <portType>
- <binding>
Questi elementi vengono organizzati nel modo seguente (vedremo più avanti il loro contenuto):
<definitions> <types> <!-- definizione dei tipi di dato utilizzati... questo dovrebbe ricordarvi qualcosa ;) --> </types> <message> <!-- definizione di uno dei messaggi impiegati dal web service per comunicare con l'applicazione client --> </message> <!-- naturalmente può esistere più di un elemento message all'interno del documento --> <portType> <!-- definisce una "porta" e le operazioni che possono essere eseguite dal web service. Definisce inoltre i messaggi coinvolti nelle operazioni elencate --> </portType> <binding> <!-- definisce il formato del messaggio ed i dettagli di protocollo per ogni porta --> </binding> </definitions>
Come redigere il documento in XML
Abbiamo detto che all'interno del tag <types>
bisogna definire i tipi che utilizzeremo nel documento; niente di più facile ora che conosciamo XML Schema. Tutto quello che dobbiamo fare è inserire uno schema adatto ai nostri propositi. Supponendo di voler creare un'operazione in grado di ricevere in input un id e di restituire le caratteristiche dell'utente con quell'id, possiamo fare come segue:
All'interno di definitions impostiamo i namespace che ci servono, per ora potrebbero bastare il tipo base XMLSchema del w3c ed un namespace tutto nostro per i tipi che andiamo a creare ma inseriamo già anche altri namespace che ci serviranno più avanti, definiamo inoltre wsdl come namespace base per gli elementi di questo documento ed il nostro namespace come namespace per quelli che creiamo
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="https://www.html.it/guida_ai_Web services"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="https://www.html.it/guida_ai_Web services">
<types>
Dato che lo abbiamo creato, decidiamo che tutti i tipi definiti dallo schema appartengono al nostro namespace (se hai dubbi torna a leggere la parte della guida relativa al tag <schema>).
<xs:schema targetNamespace="https://www.html.it/guida_ai_Web services">
Quando abbiamo visto XML Schema abbiamo sempre creato elementi. Qui non ci interessano gli elementi, ci basta il loro tipo. Non cambia nulla, in sostanza basta tralasciare il tag più esterno element e dare un nome al tipo.
<xs:complexType name="utente">
<xs:all>
<xs:element name="nickname" type="xs:string"/>
<xs:element name="nome" type="xs:string"/>
<xs:element name="cognome" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:schema>
</types>
....
Questo esempio non dovrebbe sorprendervi se avete letto la sezione dedicata ad XML Schema. Abbiamo dichiarato che il nostro Web service utilizzerà un tipo complesso utente che contiene nickname, nome, cognome ed email. Il nostro Web service richiede anche un tipo idutente, ma poichè questo fa parte dei tipi base (integer) non è necessario dichiarare un tipo personalizzato.