Si sente molto spesso parlare di web services e di architetture orientate ai servizi (SOA) applicate a diversi ambiti, soprattutto Enterprise. Con l’esplosione del mobile, negli ultimi tempi si è visto come sfruttare questi tipo di architettura per rendere fruibili contenuti sulle nuove piattaforme senza creare servizi nuovi, ma esponendo quelli esistenti sotto forma si servizi web SOAP o REST (soprattutto questi ultimi). In giro si trovano tantissime documentazioni teoriche su cosa sono i web services, su cos’è il protocollo SOAP e come com’è strutturato, ma è difficile trovare una documentazione banale che risponda a questa domanda: ho una classe scritta con Eclipse e la voglio deployare su Tomcat, punto. Come diavolo faccio ad esporla come servizio web senza diventare scemo? Vediamo se riusciamo a rispondere a questa domanda.
Prerequisiti
E’ vero che, soprattutto nel mondo mobile, la tendenza è quella di sviluppare servizi REST con payload in JSON per vari motivi:
- sfrutta appieno il protocollo HTTP;
- messaggi poco verbosi, meno occupazione di banda;
- ogni risorsa/servizio è referenziale in modo univoco tramite un URI.
Nonostante questo, è importante valutare quanto tempo impieghiamo a scrivere un servizio: con Eclipse per esempio, scrivere un servizio SOAP per Tomcat richiede 5 minuti, senza aggiungere un jar al nostro progetto (in realtà se ne occuperà Eclipse…). In questo tutorial abbiamo usato Eclipse Indigo e Tomcat 7.
Se volete potete essere completamente agnostici del servizio e passare al capitolo successivo, ma vale la pena sapere qualche nozione base. In generale, sia i servizi SOAP che REST espongono una interfaccia (anche se gli ultimi ne possono fare a meno), un contratto che descrive le funzionalità del server (chiamato producer del servizio) e alla quale il client (consumer del servizio) fa affidamento per “consumare” il servizio. Questa interfaccia, nota in SOAP come Web Service Definition Language (WSDL) e Web Application Description Language (WADL) in REST, è in XML e descrive i metodi per accedere ai servizi e i tipi di dati scambiati. Essendo in XML è chiaramente cross-platform: basta analizzare il WSDL/WADL per poter scrivere un producer o un consumer del servizio.
KISS: Keep It Simple, Stupid
Eclipse ha un ottimo generatore di codice per servizi SOAP. Non complichiamoci quindi la vita! Escludiamo subito l’eventualità folle si scrivere il WSDL a mano e seguiamo il cosiddetto approccio “bottom-up“: implementiamo cioè la nostra classe che fa quelle cose che vogliamo trasformare in un servizio, come le seguenti:
public class MyService { public String echo(String message) { return "Echo " + message; } public Output sort(Input input) { Arrays.sort(input.getVector()); return new Output(input.getVector()); } }
Dove Input
e Output
sono semplici POJO:
public class Input { private int[] vector; public Input() { } public Input(int... numbers) { this.vector = numbers; } //Getter & Setter } public class Output { private int[] sortedVector; public Output() { } public Output(int... numbers) { this.sortedVector = numbers; } //Getter & Setter }
Da notare i costruttori: secondo la specifica Java Bean, oltre ai getter & setter devo avere almeno un costruttore senza argomenti.
Ovviamente li avremo creati in un progetto web, che tutti sapete (File->New->Dynamic Web Project) adesso come fare ;).
Producer
Adesso comincia la parte più facile: lasciamo fare tutto ad Eclipse!
- Click destro sulla classe del nostro servizio, poi New->Other… e selezionare “Web Service” come in figura:
- Verrà avviato un wizard di configurazione: nella prima schermata compatirà in alto il nome della classe e la strategia di creazione del servizio (“Bottom-up”). Portiamo la levetta verticale sulla sinistra tutta in basso al livello “Test Service” come in figura:
In questo modo il servizio verrà generato, verrà automaticamente deplorato su Tomcat e si aprirà una pagina di test del servizio che vedremo al termine. Prima di proseguire selezionare anche “Monitor the Web Service” in basso in modo da monitorare i messaggi SOAP da dentro Eclipse.
- Successivamente selezioniamo il nome del file WSDL che verrà creato e i metodi della classe che vogliamo esporre come servizio:
- Gli ultimi due step sono molto semplici: verrà chiesto di avviare il Tomcat se non lo è già:
Successivamente lanciamo l’applicazione di test fornita da Eclipse:
Al termine si aprirà il browser mostrando una pagina di questo tipo:
Per il momento lasciamola perdere e guardiamo cos’è successo al nostro progetto, in particolare nella cartella WebContent:
E’ apparsa la nuova cartella wsdl contenente il descrittore del nostro servizio. Dentro WEB-INF troviamo invece un’altra nuova cartella e un file di configurazione del servizio che sembra scritto in aramaico… ma non ci interessa molto, l’importante è che tutto funzioni come verificheremo subito dalla pagina del browser che si è aperta precedentemente. Selezionando per esempio il metodo echo e inserendo una stringa, verrà visualizzato immediatamente il risultato restituito dal server. Tornando in Eclipse, possiamo verificare i messaggi scambiati dal tab “TCP/IP Monitor”:
Un’ultima curiosità: guardando il web.xml si scopre che è pieno di cose mai viste: basta poco per rendersi conto di cosa è successo. Eclipse ha aggiunto due nuova servlet:
AxisServlet
eAdminServlet
con diverse tipologie di mapping: saranno loro a ricevere le chiamate e a tradurle per il nostro servizio in Java. Axis non è altro che una implementazione open source del protocollo SOAP per Java: ogni volta che avete a che fare con Axis quindi potete scoprire tutti i servizi deplorati sul server semplicemente richiamando un URI di questo tipo:WebServiceProducerTest/services
che mostrerà gli URI dei WSDL, come quello appena creato:
WebServiceProducerTest/services/MyService?wsdl
Abbiamo quindi creato il nostro primo servizio web in pochi minuti, facile no? Nel vedremo come sarà altrettanto facile realizzare un consumer del servizio.
Pingback: ()
Pingback: ()