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.

83 Posts

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+