Web Services Implementazione di un servizio Web Authors Vincenzo Capozzoli, Antonio Sabato Spinelli Supervision Gianluca Sabatini Version ver. 1.1 Released on 23/07/2008 Code CA7-9LOT1J Status Draft 27/08/2008 Table of Content 1 2 3 Scope ______________________________________________________________ 3 Acronisms and definitions____________________________________________ 3 Introduction ________________________________________________________ 4 3.1 Axis______________________________________________________________ 4 4 Installazione ________________________________________________________ 4 5 Un semplice Web Service____________________________________________ 5 5.1 Deploy Tramite Copia di File ______________________________________ 5 5.2 Implementazione di un WS con generazione di stub e skeleton in modalità statica ____________________________________________________________ 8 5.2.1 Implementazione interfaccia Java del servizio__________________ 9 5.2.2 Generazione del file WSDL ____________________________________ 9 5.2.3 Generazione di stub e skeleton _______________________________ 12 5.2.4 Creazione del WSDD _________________________________________ 13 5.2.5 Implementazione della Business Logic_________________________ 15 5.2.6 Implementazione del client __________________________________ 16 5.3 Pro e Cons ______________________________________________________ 17 6 Monitoring _________________________________________________________ 18 6.1 TCP Monitor_____________________________________________________ 18 7 Esecuzione test ____________________________________________________ 19 8 Bibliography _______________________________________________________ 22 9 Tables _____________________________________________________________ 23 10 Figures ____________________________________________________________ 23 Implementazione di un Servizio Web ver. 1.1 [2/23] 27/08/2008 1 Scope I contenuti di questo documento permettono di avere una conoscenza tecnica di base sui Web Services utile per lo studio critico della piattaforma utilizzata da Lottomatica. In passato l’integrazione di applicazioni avveniva tra software che risiedevano sulla stessa piattaforma o middleware (come CORBA o DCOM) e tipicamente all’interno della stessa organizzazione. Volendo invece interconnettere middleware diversi è necessario standardizzare le interfacce di applicazioni appartenenti a sistemi differenti per permettere loro di interagire; la difficoltà inoltre aumenta nel caso in cui l’interazione non avvenga fra piattaforme della stessa compagnia ma appartenenti a più aziende. E così che, per superare le limitazioni di middleware e piattaforme EAI, sono introdotti i Web Services e viene adottata l’Architettura Orientata ai Servizi (SOA). In particolare, Axis è una piattaforma Java open source prodotta dalla Apache Software Foundation, che abilita la creazione e l’utilizzo di applicazioni che si basano sui Web Services, ovvero il motore per l’esecuzione di web service. Axis è in particolare una servlet che, per la sua esecuzione, necessita di un contenitore di servlet che nel caso trattato è Tomcat. 2 Acronisms and definitions Acronim Definition WS Web Service WSDL Web Service Definition Language WSDD Web Service Deployment Descriptor SOA Service Oriented Architecture SII Static Invocation Interface JWS Java Web Service EAI Enterprise Application Integration SOAP Simple Object Access Protocol UDDI Universal Description Discovery and Integration SAX Simple API for XML IDE Integrated development environment Table 2-1 Acronisms and Definitions Implementazione di un Servizio Web ver. 1.1 [3/23] 27/08/2008 3 Introduction I Web Services rappresentano una tecnologia consolidata e si trovano in circolazione diverse implementazioni per eseguire deploy delle proprie applicazioni come web service utilizzando i tre mattoni fondamentali, ovvero SOAP, WSDL e UDDI. Questo documento verte prevalentemente sugli aspetti pratici della realizzazione di un web service con Axis. 3.1 Axis Axis non è un semplice engine SOAP ma un framework per realizzare sistemi di integrazione basati su SOAP. Il progetto non è una revisione della precedente versione del toolkit, Apache SOAP 2.x, ma una completa riscrittura che nasce dalla necessità di disporre di una migliore architettura basata su criteri di • flessibilità: è possibile estendere l'engine per eseguire elaborazioni custom degli header dei messaggi; • componibilità: i gestori di richieste, chiamati Handler in terminologia Axis, possono essere riutilizzati; • indipendenza dal meccanismo di trasporto dei messaggi: in questo modo è possibile utilizzare vari protocolli oltre ad HTTP come SMTP, FTP e messaging. Rispetto alla versione precedente di SOAP in Axis si è cercato inoltre di migliorare le performance utilizzando SAX per l'elaborazione dei messaggi. Nel seguito si fa riferimento alla beta 2 di Axis che implementa le specifiche 1.1 di SOAP e offre un supporto parziale a SOAP 1.2. 4 Installazione L'installazione di Axis (ver. 1.x)1 è abbastanza semplice: il prerequisito fondamentale è un servlet container e negli esempi presentati si fa riferimento a Tomcat (ver. 6.x)2. Innanzitutto, copiare il folder webapps/axis dalla distribuzione nel folder webapps di Tomcat. I web service saranno quindi accessibili all'URL http://hostname:port/axis/... All'interno di webapps/axis si trova il folder WEB-INF in cui copiare le classi che si vogliono esporre come web service: i file .class verranno copiati nel folder classes mentre i file .jar nel folder lib. Prima di usare Axis è comunque necessario copiare il file tools.jar, activation.jar e mail.jar in WEB-INF/lib3. Ora Tomcat è configurato per esporre web service con Axis. 1 E’ possible scaricare Axis ver. 1.x da: http://www.apache.org/dyn/closer.cgi/ws/axis/1_4 2 E’ possible scaricare Tomcat ver. 6.x da: http://tomcat.apache.org/download-60.cgi 3 È possibile scaricare i file .jar da: http://sunsolve.sun.com/search/document.do?assetkey=1-21-128641-02- Implementazione di un Servizio Web ver. 1.1 [4/23] 27/08/2008 5 Un semplice Web Service In questa sezione si affronta il problema del deploy di un web service con Axis mostrando due casi di difficoltà crescente: • deploy di una classe Java con copia di file; • deploy della stessa classe mediante deployment descriptor (Approccio SII); 5.1 Deploy Tramite Copia di File Per effettuare in modo semplice (ma anche poco flessibile) il deployment di una applicazione è possibile creare una classe java che implementa il servizio e copiarla in Axis con estensione .jws. In particolare si riporta di seguito la classe java che implementa il servizio ‘Calculator’: public class Calculator { public Integer sum(int x, int y) { return new Integer(x+y); } public Integer sub(int x, int y) { return new Integer(x-y); } public String pari(int numero) { return (numero % 2) == 0 ? "pari" : "dispari"; } } La classe Calculator offre tre servizi: • sum(x, y) - calcola la somma di x e y • sub(x, y) - calcola la differenza di x e y • pari(x) – restituisce una stringa che segnala se x è un numero pari o dispari Per eseguire un deploy istantaneo della classe è sufficiente copiare il sorgente nel folder della web application di Axis con estensione .jws. A questo punto il servizio è immediatamente disponibile all'URL http://localhost:8080/axis/Calculator.jws: automaticamente il motore Axis restituisce il WSDL del servizio reperibile all’URL: http://localhost:8080/axis/Calculator.jws?WSDL Implementazione di un Servizio Web ver. 1.1 [5/23] 27/08/2008 E' il runtime engine di Axis che compila il file JWS in classe Java e inoltra ad essa le chiamate SOAP provenienti da una qualsiasi applicazione client capace di inviare invocazioni a servizi web tramite SOAP (Figura 5-1). Il file compilato (.class) sarà poi disponibile nella cartella \WEB-INF\jwsClasses di Axis. Figura 5-1 - Schema di interazione client/web service In Figura 5-1 è indicata la modalità d’interazione Client/WS. Il Client richiede il servizio al Server sulla porta 8080 utilizzando SOAP/http; il Server elabora quindi la richiesta attraverso il WS Engine Axis. Creata la risposta, questa viene inviata al Client sotto-forma di messaggio SOAP. Dopo aver realizzato un web service ecco un client java che lo utilizza: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import import import import import import import org.apache.axis.client.Call; org.apache.axis.client.Service; org.apache.axis.encoding.XMLType; java.io.BufferedReader; java.io.InputStreamReader; java.net.URL; javax.xml.rpc.ParameterMode; public class TestClient { public static void main(String[] args) throws Exception { System.out.println("SERVIZIO PARI/DISPARI..."); //Inizializzazione dei Parametri InputStreamReader is = new InputStreamReader( System.in ); BufferedReader br = new BufferedReader( is ); Implementazione di un Servizio Web ver. 1.1 [6/23] 27/08/2008 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 System.out.print("Inserisci il numero: "); Integer numero = new Integer(br.readLine()); String nameWS = "http://localhost:8080/axis/Calculator.jws"; URL endPointWS = new URL(nameWS); //Inizializzazione SERVIZIO PARI/DISPARI Service service = new Service(); Call call = (Call)service.createCall(); call.removeAllParameters(); //Configurazione parametri SERVIZIO PARI/DISPARI call.setTargetEndpointAddress(endPointWS); call.addParameter("numero", XMLType.XSD_INT, ParameterMode.IN); call.setOperationName("pari"); call.setReturnType(XMLType.XSD_STRING); //Invocazione SERVIZIO PARI/DISPARI String risultato = (String)call.invoke(new Object[]{numero}); //Mostra il risultato System.out.println("Il numero " + numero + " e' " + risultato); System.out.println("\nSERVIZIO SOMMA/DIFFERENZA..."); //Inizializzazione dei Parametri System.out.print("Inserisci il primo numero: "); Integer x = new Integer(br.readLine()); System.out.print("Inserisci il secondo numero: "); Integer y = new Integer(br.readLine()); call.removeAllParameters(); //Configurazione parametri WS per la chiamata a sum() call.addParameter("x", XMLType.XSD_INT, ParameterMode.IN); call.addParameter("y", XMLType.XSD_INT, ParameterMode.IN); call.setOperationName("sum"); call.setReturnType(XMLType.XSD_INT); //Invocazione WS Integer risultato2 = (Integer)call.invoke(new Object[]{x,y}); //Mostra il risultato System.out.println("La somma e': " + risultato2); call.removeAllParameters(); //Configurazione parametri WS per la chiamata a sub() call.addParameter("x", XMLType.XSD_INT, ParameterMode.IN); call.addParameter("y", XMLType.XSD_INT, ParameterMode.IN); call.setOperationName("sub"); call.setReturnType(XMLType.XSD_INT); //Invocazione WS risultato2 = (Integer)call.invoke(new Object[]{x,y}); //Mostra il risultato System.out.println("La differenza e': " + risultato2); Implementazione di un Servizio Web ver. 1.1 [7/23] 27/08/2008 62 63 } } Il codice presentato implementa le seguenti operazioni: • viene prelevato dallo std d’input un numero intero (linee 11-18); • viene creato un oggetto Service come punto di partenza per connettersi ad un web service SOAP; è possibile specificare un documento WSDL per ottenere informazioni sul servizio (linee 20-23); • si crea quindi un oggetto Call che incapsula la chiamata vera e propria e si impostano le proprietà necessarie, in questo caso URL del servizio e nome del metodo da richiamare sul servizio. Si osservi che queste informazioni potrebbero essere ricavate dal WSDL (linee 25-33); • a questo punto si impostano i parametri applicativi per l'invocazione del servizio inserendoli in un array di oggetti: in questo caso si tratta di un semplice numero intero (linee 25-29); • infine si invoca il servizio e si ottiene il risultato dell'operazione (linee 3033); • le stesse operazioni sono state eseguite con i servizi sum() e sub(), utilizzando l’oggetto call già allocato in precedenza (linee 35-61). 5.2 Implementazione di un WS con generazione di stub e skeleton in modalità statica In questo paragrafo si vuole mostrare una modalità alternativa di implementazione di un WS basata sulla generazione di uno STUB e di uno SKELETON che incorporano tutte le funzionalità necessarie per la comunicazione tra WS e Service Requestor. Tale generazione avviene in maniera statica. I passi da seguire sono: 1. implementazione di una interfaccia Java che specifica le operazioni che il servizio mette a disposizione; 2. generazione del file WSDL a partire dall’interfaccia Java di cui al punto 1; 3. generazione di stub e skeleton a partire dal file WSDL; 4. creazione del WSDD (Web Service Deployment Descriptor); 5. implementazione della Business Logic nella classe Java ServiceNameSoapBindingImpl ; 6. implementazione dell’applicazione client che utilizzerà lo stub per invocare il servizio. Per rendere l’esecuzione di tale fasi più agevole si è scelto di adoperare l’ambiente di sviluppo ECLIPSE (http://www.eclipse.org/ ): il motivo principale della scelta fatta è che ECLIPSE è un IDE Java da noi già ben conosciuto al momento Implementazione di un Servizio Web ver. 1.1 [8/23] 27/08/2008 della stesura del presente documento. Una valida alternativa è l’ambiente di sviluppo NETBEANS(http://www.netbeans.org/ ) il quale richiede però al sistema maggiori performance (in termini di memoria e spazio su disco) per funzionare al meglio. È inoltre possibile eseguire queste fasi senza l’installazione di alcun ambiente di sviluppo utilizzando le istruzioni mediante la linea di comando di MSDOS. Si farà ancora riferimento al servizio Calculator presentato nel paragrafo 5.1. 5.2.1 Implementazione interfaccia Java del servizio Dopo aver creato un nuovo progetto Eclipse4 occorre importare in esso le seguenti librerie5: • • • • • • • • • • • activation.jar; axis.jar; axis-ant.jar; commons-discovery-02.jar; commons-logging-1.0.4.jar; jaxrpc.jar; log4j-1.2.8.jar; mail-1.4.jar; saaj.jar; tools.jar; wsdl4j-1.5.1.jar. che sono contenute all’interno della cartella /WEB-INF/lib di AXIS. A questo punto è necessario scrivere l’interfaccia Java del servizio Calculator: 1 2 3 4 5 6 public interface Calculator { public int sum(int x, int y) throws java.rmi.RemoteException; public java.lang.String pari(int numero) throws java.rmi.RemoteException; public int sub(int x, int y) throws java.rmi.RemoteException; } 5.2.2 Generazione del file WSDL E’ ora necessario generare il file WSDL a partire dall’interfaccia Calculator.java . Per fare ciò occorre aprire Referenced Libraries dal Package Explorer di Eclipse e quindi aprire axis.jar e poi org.apache.axis.wsdl e cliccare con 4 Consultare l’help di eclipse cercando la voce “new project wizard” 5 Consultare l’help di eclipse cercando la voce “build path” Implementazione di un Servizio Web ver. 1.1 [9/23] 27/08/2008 il tasto destro su Java2WSDL.class come mostrato in Figura 5-2: Figura 5-2- Generazione WSDL Aprire ora “Run asÆRun Configurations” e cliccare sul tab Arguments e in Program arguments inserire la seguente stringa (Figura 5-3): -o src\Calculator.wsdl -l"http://10.50.5.155:8080/axis/services/Calculator" "urn:calculator"-p"Calculator" "urn:Calculator" Calculator Implementazione di un Servizio Web ver. 1.1 -n [10/23] 27/08/2008 Figura 5-3 – Schermata inserimento parametri A questo punto nella cartella bin del progetto eclipse è stato creato il file calculator.wsdl (Figura 5-4). Implementazione di un Servizio Web ver. 1.1 [11/23] 27/08/2008 Figura 5-4 - Cartella di eclipse contente il file calculator.wsdl 5.2.3 Generazione di stub e skeleton Dal package explorer di Eclipse selezionare axis.jar e poi org.apache.axis.wsdl e cliccare con il tasto destro su WSDL2Java.class. Aprire ora Run Configurations e cliccare sul tab Arguments e in Program arguments inserire la seguente stringa: src\Calculator.wsdl -o src -p calculator -S true Implementazione di un Servizio Web ver. 1.1 [12/23] 27/08/2008 Figura 5-5 - Pakage explorer di eclipse A questo punto nel progetto Eclipse è stato creato il package calculator con le seguenti classi: • Calculator.java • CalculatorService.java • CalculatorServiceLocator.java • CalculatorSoapBindingStub.java • CalculatorSoapBindingImpl.java • Calculator_PortType.java 5.2.4 Creazione del WSDD Dal package explorer di Eclipse selezionare axis.jar e poi org.apache.axis.client e cliccare con il tasto destro su AdminClient.class. Aprire ora Open Run Dialog e cliccare sul tab Arguments e in Program arguments inserire la seguente stringa: src\calculator\deploy.wsdd Implementazione di un Servizio Web ver. 1.1 [13/23] 27/08/2008 Figura 5-6 - Creazione del file .wsdd A questo punto è stato creato il Deployment Descriptor del servizio, accessibile dal package calculator creato nel paragrafo precedente attraverso il comando WSDL2Java. Questo file presenta il seguente contenuto: 1 2 3 <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> Implementazione di un Servizio Web ver. 1.1 [14/23] 27/08/2008 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!-- Services from CalculatorService WSDL service --> <service name="Calculator" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="urn:calculator"/> <parameter name="wsdlServiceElement" value="CalculatorService"/> <parameter name="wsdlServicePort" value="Calculator"/> <parameter name="className" value="calculator.CalculatorSoapBindingSkeleton"/> <parameter name="wsdlPortType" value="Calculator"/> <parameter name="typeMappingVersion" value="1.2"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> L'elemento service definisce appunto il web service a cui è stato dato il nome calculator. L'attributo provider permette di specificare il modo in cui il servizio viene esposto; in questo caso si usa il provider per una classe Java quindi si usa java:RPC come valore dell'attributo. L'elemento parameter permette di specificare i parametri di configurazione del servizio, in questo caso il nome della classe e i metodi esposti. Maggiori dettagli su questo punto sono disponibili sul sito: http://www.omii.ac.uk/docs/2.3.0/reference/apache_axis/wsdd/wsdd.htm 5.2.5 Implementazione della Business Logic Dal package calculator creato con il comando WSDL2Java aprire la classe CalculatorSoapBindingImpl.java e scrivere la Business Logic del servizio: package calculator; public class CalculatorSoapBindingImpl implements calculator.Calculator_PortType{ public int sum(int in0, int in1) throws java.rmi.RemoteException { return in0+in1; } public java.lang.String pari(int in0) throws java.rmi.RemoteException { if(in0%2==0) return "pari"; else return "dispari"; } public int sub(int in0, int in1) throws java.rmi.RemoteException { Implementazione di un Servizio Web ver. 1.1 [15/23] 27/08/2008 return in0-in1; } } Quindi copiare il package calculator con i file .class nella cartella /WEBINF/classes di Axis. 5.2.6 Implementazione del client A questo punto è necessario l’implementazione dell’applicazione client che dovrà richiedere il servizio servendosi dello stub calculator.CalculatorSoapBindingStub: import java.io.BufferedReader; import java.io.InputStreamReader; public class ClientSII { public static void main (String[] args) throws Exception { calculator.Calculator_PortType binding = new calculator.CalculatorServiceLocator().getCalculator(); ((calculator.CalculatorSoapBindingStub)binding).setMaintainSession(true); try { InputStreamReader is = new InputStreamReader( System.in ); BufferedReader br = new BufferedReader( is ); System.out.println("Inserisci il primo numero: "); Integer x = new Integer(br.readLine()); System.out.println("Inserisci il secondo numero: "); Integer y = new Integer(br.readLine()); System.out.println("La differenza è: "+ binding.sub(x,y)); System.out.println("La somma è: " + binding.sum(x,y)); System.out.println("Inserisci un numero per sapere se è pari o dispari: "); Integer z = new Integer(br.readLine()); System.out.println("Il numero è: " + binding.pari(z)); } catch (java.rmi.RemoteException re) { re.printStackTrace(); } } } Come si può notare la classe ClientSII.class richiama i servizi sum, sub, pari come se essi fossero locali servendosi semplicemente dello stub. In Figura 5-1FIGURA 5-7 è indicato lo schema d’interazione per la soluzione Implementazione di un Servizio Web ver. 1.1 [16/23] 27/08/2008 descritta in questo paragrafo. La classe java ClientSII localizzata sull’host Client comunica direttamente con la classe CalculatorSoapBindingStub per inviare via SOAP/http le richieste al Server. Sul Server il WS Engine Axis intercetta le richieste Client e le passa al componente calculator che contiene tutte le classi java atte ad elaborare la risposta e passarla tramite messaggi SOAP allo stub lato Client, il quale restituisce i risultati alla classe java ClientSII, che infine li stampa a console. FIGURA 5-7 - Schema di interazione Clent/Web Server tramite stub 5.3 Pro e Cons Vediamo quali so i pro ed i contro dei due approcci illustrati: • Deploy tramite copia di file: o semplice; o poco flessibile; o il codice necessario per un client Axis è semplice ma abbastanza verboso: è ad esempio scomodo dover specificare i parametri del servizio come array di oggetti ed inoltre è necessario usare esplicitamente la API Axis; o non è sempre utilizzabile, spesso il servizio di cui fare il deploy non sarà implementato con una singola classe Java ed è inoltre necessario un modo per configurare i parametri di deploy come ad esempio il mapping dei tipi. • Deploy con generazione di stub e skeleton in modalità statica: o abbastanza elaborato e complesso; o flessibile; o il codice necessario per un client Axis è semplice; o è sempre utilizzabile. Implementazione di un Servizio Web ver. 1.1 [17/23] 27/08/2008 6 Monitoring 6.1 TCP Monitor Per verificare il corretto funzionamento di un web service Axis mette a disposizione una comoda utility, TCPMon, che permette di monitorare il traffico di rete generato dal servizio. Lo si lancia con: java org.apache.axis.utils.tcpmon Appare quindi la seguente interfaccia per l'inserimento dei parametri: Figura 6-1 - TCP Monitor utilizzando il tool come Listener si devono impostare • Listen Port #: numero di porta su cui TCPMon si pone in ascolto per le richieste (deve essere necessariamente diversa dalla Target Port# - la Implementazione di un Servizio Web ver. 1.1 [18/23] 27/08/2008 poniamo pari a 9090 facendo attenzione a che il client richieda il servizio su tale porto); • Target Hostname: host su cui inoltrare le richieste; • Target Port #: il numero di porta utilizzato dall'host target. Premendo il pulsante Add viene aggiunto un tab con le informazioni sulla connessione inserita: Figura 6-2 - TCP Monitor schermata visualizzazione pacchetti 7 Esecuzione test Si lancia la classe TestClient.java (descritta nel paragrafo 5.1) che invoca il servizio PARI/DISPARI ed in successione i servizi SOMMA e DIFFERENZA con i Implementazione di un Servizio Web ver. 1.1 [19/23] 27/08/2008 seguenti parametri inseriti a linea di comando come si vede da Figura 7-1 e da Figura 7-2: Figura 7-1 - Parametri input Pari/Dispari Figura 7-2 - Parametri input Somma/Differenza Si ottengono nel TCPMonitor tre finestre che si aprono cliccando sulle 3 righe nella tabella in alto, che monitorano ciascuno dei 3 servizi: Implementazione di un Servizio Web ver. 1.1 [20/23] 27/08/2008 Figura 7-3 - Pacchetti TCP Monitor Come si vedere da Figura 7-3, nelle 2 finestre in basso si possono visualizzare i messaggi http scambiati per l’invocazione dei servizi. Nella finestra superiore si trova il messaggio di richiesta e nella finestra inferiore si visualizza il messaggio di risposta. Nel body dei messaggi è possibile visualizzare il valore delle variabili di input sulle quali viene invocato il servizio e il valore delle variabili restituite al client e contenenti a seconda del servizio invocato la somma, la differenza o una stringa che indica se il valore della variabile di input è pari o dispari. Implementazione di un Servizio Web ver. 1.1 [21/23] 27/08/2008 8 Bibliography [1] Apache Axis documentation - http://ws.apache.org/axis2/1_4/contents.html [2] Service Oriented Architecture and Web Services - Andrea Polini 2007 [3] Axis - http://www.apache.org/dyn/closer.cgi/ws/axis/1_4 [4] Tomcat - http://tomcat.apache.org/download-60.cgi [5] Eclipse - http://www.eclipse.org/ [6] Info su WSDD http://www.omii.ac.uk/docs/2.3.0/reference/apache_axis/wsdd/wsdd.htm [7] uso di Stub e Skeleton - http://www.mokabyte.it/2002/09/axis.htm Implementazione di un Servizio Web ver. 1.1 [22/23] 27/08/2008 9 Tables Table 2-1 Acronisms and Definitions ______________________________________ 3 10Figures Figura 5-1 - Schema di interazione client/web service.........................................6 Figura 5-2- Generazione WSDL .................................................................................1 Figura 5-3 – Schermata inserimento parametri................................................... 11 Figura 5-4 - Cartella di eclipse contente il file calculator.wsdl......................... 12 Figura 5-5 - Pakage explorer di eclipse ................................................................ 13 Figura 5-6 - Creazione del file .wsdd..................................................................... 14 FIGURA 5-7 - Schema di interazione Clent/Web Server tramite stub .............. 17 Figura 6-1 - TCP Monitor .......................................................................................... 18 Figura 6-2 - TCP Monitor schermata visualizzazione pacchetti......................... 19 Figura 7-1 - Parametri input Pari/Dispari ............................................................... 20 Figura 7-2 - Parametri input Somma/Differenza .................................................. 20 Figura 7-3 - Pacchetti TCP Monitor ........................................................................ 21 Implementazione di un Servizio Web ver. 1.1 [23/23]