Web Services for dummies: creare un servizio web SOAP per Tomcat – il Producer

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!

  1. Click destro sulla classe del nostro servizio, poi New->Other… e selezionare “Web Service” come in figura:

    Seleziona "Web Service"
  2. 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:

    Seleziona il servizio e il livello di deploy

    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.

  3. Successivamente selezioniamo il nome del file WSDL che verrà creato e i metodi della classe che vogliamo esporre come servizio:

    WSDL e metodi da esporre
  4. Gli ultimi due step sono molto semplici: verrà chiesto di avviare il Tomcat se non lo è già:

    Avvia Tomcat

    Successivamente lanciamo l’applicazione di test fornita da Eclipse:

    Avvio dell'applicazione di test
  5. Al termine si aprirà il browser mostrando una pagina di questo tipo:

    Applicazione di test: selezionare un metodo

    Per il momento lasciamola perdere e guardiamo cos’è successo al nostro progetto, in particolare nella cartella WebContent:

    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”:

    Monitor traffico SOAP in ingresso e in uscita

    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 e AdminServlet 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:

    http://localhost:8080/WebServiceProducerTest/services

    che mostrerà gli URI dei WSDL, come quello appena creato:

    http://localhost:8080/WebServiceProducerTest/services/MyService?wsdl

    Abbiamo quindi creato il nostro primo servizio web in pochi minuti, facile no? Nel prossimo post vedremo come sarà altrettanto facile realizzare un consumer del servizio.

Author :
Sono un software engineer focalizzato nella progettazione e sviluppo di applicazioni web in Java. Presso OmniaGroup ricopro il ruolo di Tech Leader sulle tecnologie legate alla piattaforma Java EE 5 (come WebSphere 7.0, EJB3, JPA 1 (EclipseLink), JSF 1.2 (Mojarra) e RichFaces 3) e Java EE 6 con JBoss AS 7, in particolare di CDI, JAX-RS, nonché di EJB 3.1, JPA2, JSF2 e RichFaces 4. Al momento mi occupo di ECM, in particolar modo sulla customizzazione di Alfresco 4 e sulla sua installazione con tecnologie da devops come Vagrant e Chef. In passato ho lavorato con la piattaforma alternativa alla enterprise per lo sviluppo web: Java SE 6, Tomcat 6, Hibernate 3 e Spring 2.5. Nei ritagli di tempo sviluppo siti web in PHP e ASP. Per maggiori informazioni consulta il mio curriculum pubblico. Follow me on Twitter - LinkedIn profile - Google+