Web Services con Axis Delia Di Giorgio Anna Celada 1 marzo 2005 Sommario Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UDDI, le pagine gialle dei servizi WEB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. Installazione di Java, Axis e Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Implementazione lato server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Implementazione lato client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 2 2 3 5 6 Introduzione Il Web Service (WS) e’ un’interfaccia che descrive una collezione di operazioni accessibile attraverso una rete mediante messaggistica XML. Fornisce un linguaggio e una piattaforma di accesso comune a sistemi differenti. La tecnologia Web Service e’ essenzialmente basata sul messaggio e quindi era necessario adottare un insieme di regole per poter inoltrare una richiesta client e costruire quindi un messaggio; per rappresentare i dati scambiati e’ stato scelto l’XML. Il trasporto di questi dati nel suddetto formato e’ affidato al protocollo HTTP. Dalla combinazione di XML e HTTP nasce il protocollo SOAP (Simple Object Access Protocol), il protocollo standard per i Web Services. La descrizione dei servizi web e’ affidata al WSDL (Web Services Description Language). La forza del modello dei Web Services e’ di utilizzare un set base di protocolli disponibili ovunque, permettendo l’interoperabilita’ tra piattaforme molto diverse e mantenendo comunque la possibilita’ di utilizzare protocolli piu’ avanzati e specializzati per effettuare compiti specifici. I protocolli alla base del modello dei Web Services sono quattro: • XML e’ lo standard usato per rappresentare i dati trasportati • SOAP e’ lo standard usato per definire il formato dei messaggi scambiati • WSDL e’ un formato XML per la descrizione di servizi di rete che fornisce tutte le informazioni necessarie per l’utilizzo di un servizio web (formato dei messaggi, protocollo di trasporto, etc.). • UDDI e’ lo standard promosso dall’omonimo consorzio, e serve per rintracciare i servizi sulla rete. 1 SOAP SOAP (Simple Object Access Protocol) e’ un protocollo che specifica come formattare i dati in formato XML, dati che possono essere messaggi, o chiamate di procedure remote. SOAP prevede un formato standard per l’encoding dei dati, che puo’ comunque essere esteso a piacere e definisce come usare i protocolli come HTTP, SMTP, e altri per il trasporto dei dati stessi. Utilizzando SOAP con HTTP si mette la richiesta SOAP nel messaggio di richiesta HTTP, e la risposta puo’ essere il solo codice di stato HTTP 200 (che indica che tutto e’ andato bene) o un messaggio SOAP piu’ dettagliato contenente i valori di ritorno. Anche in caso di errore si puo’ inviare il solo codice di stato HTTP 500 (Internal Server Error), o si puo’ inviare un messaggio SOAP con la descrizione dettagliata del codice di errore. WSDL Una volta definito il modo in cui comunicare e’ necessario sapere cosa mettere a disposizione e cosa e’ possibile rendere disponibile con un Web Service. Se possiamo utilizzare un metodo di un oggetto, allora abbiamo bisogno come minimo di sapere come si chiama il metodo, che parametri accetta, di che tipo e come va interpretato il risultato ottenuto. E’ proprio questo il compito del file WSDL (Web Service Description Language), un file in formato XML che descrive il Web Service in termini di metodi richiamabili, nomi dei parametri, tipi, ecc. E’ una sorta di contratto tra client e server, che si accordano in questo modo sulle informazioni da scambiarsi. In sintesi esso descrive: • COSA fa un servizio; • DOVE risiete; • COME invocarlo. UDDI, le pagine gialle dei servizi WEB UDDI (Universal Discovery Description Integration) e’ una specifica per la realizzazione di registri distribuiti, basati sul web, di servizi web; i registri UDDI vengono usati per la ricerca e la promozione di servizi web. UDDI e’ un consorzio a cui partecipano quasi 300 aziende che ha come scopo quello di favorire lo sviluppo, la scoperta e l’interoperabilita’ dei servizi Web. UDDI fornisce un database distribuito su cui si possono registrare le aziende ed i servizi da loro esposti. Esempio Realizziamo ora una infrastruttura di Web Service in Java basata su Axis, implementando i servizi per la realizzazione di una calcolatrice aritmentica (add, sub, mul, div, pow). 1. Installazione di Java, Axis e Tomcat 2 Come primo passo e’ necessario aver configurato Java su una macchina Linux. e’ possibile scaricarsi dal sito della Sun (http://java.sun.com) il pacchetto. Al termine dell’installazione e’ necessario settare le variabili di sistema $JAVA_ HOME e $PATH, che contengono rispettivamente il percorso della directory d’installazione di JAVA e degli eseguibili: export JAVA_HOME=/home/studenti/anna.celada/progetto/jdk1.5.0_01 export PATH=$PATH:$JAVA_HOME/bin Copiamo ora le librerie di axis nella directory /lib di java. A questo punto scarichiamo Tomcat dal sito http://apache.tomcat.org e lo installiamo sulla nostra macchina. Esistono comodi script per l’avvio e l’arresto dell’application server che si trovano in $CATALINA_HOME/bin Axis e’ un’API di programmazione e deployment di WS, che permette di lavorare ad un livello di astrazione elevato. Per quanto riguarda Axis e’ sufficiente scaricarsi il pacchetto dal sito (http://xml.apache.org/axis) e scompattarlo. All’interno di questo, sono presenti la cartella /lib che va copiata nella cartella /common di Tomcat e la cartella /webapps/axis che contiene tutte le risorse necessarie al funzionamento di Axis. Essa va interamente copiata sotto la webapps di Tomcat. In questo modo avremo dotato il nostro server di un Web service engine (di fatto una struttura Servlet) in grado di esaudire richieste provenienti da qualsiasi client WS. Successivamente configuriamo le seguenti variabili globali (varenv.sh): export CATALINA_HOME=/home/studenti/anna.celada/progetto/jakarta-tomcat-5.5.7 export JAVA_ENDORSED_DIRS=$CATALINA_HOME/bin:\ $CATALINA_HOME/common/lib:\ $CATALINA_HOME/webapps/axis/WEB-INF/lib export AXIS_HOME=/home/studenti/anna.celada/progetto/axis-1_2RC2/ export AXIS_LIB=$AXIS_HOME/lib export AXISCLASSPATH=$AXIS_LIB/axis.jar:\ $AXIS_LIB/commons-discovery.jar:\ $AXIS_LIB/commons-logging.jar:\ $AXIS_LIB/jaxrpc.jar:\ $AXIS_LIB/saaj.jar:\ $AXIS_LIB/log4j-1.2.8.jar:\ $AXIS_LIB/xml-apis.jar:\ $AXIS_LIB/xercesImpl.jar La variabile $AXISCLASSPATH rappresenta i riferimenti alle librerie jar che contengono l’implementazione degli standard sui WS. Per verificare che Axis e Tomcat siano stati integrati correttamente apriamo il browser e scriviamo http://localhost:8080/axishttp://localhost:8080/axis: dovrebbe comparire la home page testuale di Axis. 2. Implementazione lato server 3 Apache AXIS implementa il nuovo standard JWS di Java che permette di effettuare il deploy di un WS in maniera semplice e veloce. E’ sufficiente sviluppare la propria classe in Java, testarla, cambiare l’estensione da .java e .jws e il WS e’ pronto. Axis lo compilera’ e si occupera’ dell’interfacciamento con SOAP mediante la conversione automatica SOAP-JAVA. Tale metodo ha il pregio della semplicita’ a scapito della flessibilita’: e’ infatti impossibile decidere quali metodi esporre e specificare conversioni specifiche tra SOAP e JAVA. Un WS accessibile e’ quindi una classe Java che espone i propri metodi pubblici e non-static. Scriviamo ora la nostra classe calcola.java che implementa le operazioni: somma, differenza, prodotto, divisione e potenza. public class calcola { public int add(int i1, int i2) { return i1 + i2; } public int sub(int i1, int i2) { return i1 - i2; } public int mul(int i1, int i2) { return i1 * i2; } public int div(int i1, int i2) { return i1 / i2; } public int pow(int i1, int p) { int n = i1; for(int j=1; j <= p; j++) i1 *=n; return i1; } } Rinominiamo il calcola.java con l’estensione .jws e lo copiamo nella directory $CATALINA_HOME/webapps/axis. Ora e’ necessario eseguire il deploy, ovvero quella operazione che permette di rendere disponibile il nostro WS ottenendo il file WSDL descrittore del WS. Per ottenere questo e verificare la corretta interpretazione e compilazione dei WS si digiti nel browser: http://localhost:8080/axis/calcola.jws?WSDL Vediamo la struttura del file WSDL ottenuto: • wsdl:message: indicano il tipo dei dati scambiati • wsdl:portType: il tipo di operazione e i parametri 4 • wsdl:bindings: il tipo di protocollo usato • wsdl:service: caratteristiche del WS come l’indirizzo Abbiamo quindi reso accessibile il WS, vediamo ora come possiamo interrogarlo. 3. Implementazione lato client Ci sono tre modi per implementare un client del servizio: • usando Dynamic Invocation Interface (DII) • usando lo stub creato a partire dal file WSDL grazie al tool JAX-RPC • usando il proxy dinamico Noi useremo il DII; ecco il codice del client: import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.utils.Options; import javax.activation.*; import javax.xml.rpc.ParameterMode; public class ClientCalcolatrice { public static void main(String [] args) throws Exception { Options options = new Options(args); String endpoint = "http://localhost:8080/axis/calcola.jws"; args = options.getRemainingArgs(); if (args == null || args.length != 3) { System.err.println("Utilizzo: ClientCalcolatrice <add|sub|mul|div|pow> arg1 arg2"); return; } String method = args[0]; if (!(method.equals("add") || method.equals("sub") || method.equals("mul")|| method.equals("div")|| method.equals("pow") )) { System.err.println("Utilizzo: ClientCalcolatrice <add|sub|mul|div|pow> arg1 arg2"); return; } 5 Integer i1 = new Integer(args[1]); Integer i2 = new Integer(args[2]); Service Call service = new Service(); call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName( method ); call.addParameter( "op1", XMLType.XSD_INT, ParameterMode.IN ); call.addParameter( "op2", XMLType.XSD_INT, ParameterMode.IN ); call.setReturnType( XMLType.XSD_INT ); Integer ret = (Integer) call.invoke( new Object [] { i1, i2 }); System.out.println("Risultato ottenuto : " + ret); } } Diamo uno sguardo al codice: • Istanziazione delle classi di Axis Service e Call, dove quest’ultima imposta la chiamata; • Configurazione dell’endpoint: in questo caso l’indirizzo del WS (setTargetEndpointAddress); • Indicazione del tipo dei parametri d’ingresso (addParameter); • Indicazione del nome del metodo da invocare (setOperationName); • Indicazione del tipo dei parametri d’uscita (setReturnTipe); • Indicazione dei parametri e invocazione del metodo (invoke); • Gestione del risultato. Ora i comandi per la compilazione, l’avvio e l’output: # javac -classpath $AXISCLASSPATH ClientCalcolatrice.java # java -cp $AXISCLASSPATH ClientCalcolatrice operazione parametro1 parametro2 Conclusioni In questo semplice esempio sono state esaminate le basi per l’impiego di Axis nello sviluppo di applicazioni basate sui Web Services. 6