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