Università degli Studi di Bologna Facoltà di Ingegneria Corso di Modelli e Applicazioni in Reti di Calcolatori L-S Esempi di Implementazione e Uso dei WEB SERVICES Luca Foschini Anno accademico 2007/2008 Web Services 1 Web Services Differenza tra Servizi Web e Web Services da una parte, gli utenti ottengono servizi Web in un sistema integrato facendo computazione via Web, C2B dall’altra, i Web services sono una specifica diversa e precisa per ottenere a livello Web tutto quello che si può ottenere a livello di linguaggio di programmazione e di computazione tipicamente B2B Stiamo considerando tutto l’ambito HTML-compatibile in più assumendo di usare strumenti che tengano in conto alcune estensioni come XML (eXtensible Markup Language) Prospettiva di massima apertura Web Services 2 MIDDLEWARE nel supporto a sistemi MIDDLEWARE E COMPONENTI: direzioni di evoluzione e stato dell'arte Fornitura di servizi in ambiente distribuito pervasivo e ubiquo Sempre più servizi intesi come sistemi o framework per la integrazione e composizione di oggetti distribuiti Con garanzia di superare eterogeneità e mantenere i corretti livelli di sicurezza Web Services 3 MIDDLEWARE ad OGGETTI MIDDLEWARE diffusi basati su modello Cliente-Servitore: RPC (in C) e RMI (in Java) Problemi: – ambienti monolinguaggio – difficile integrazione con sistemi e strumenti esistenti (anche legacy) Web Services 4 Web Services come protocolli Web Services come MIDDLEWARE di Integrazione SOAP (Simple Object Access Protocol) WSDL (Web Services Description Language) UDDI (Universal Discovery, Description and Integration) insieme con altre estensioni Per ottenere la possibilità di interoperare come usando la programmazione ma attraverso il Web (uso di XML) Web Services 5 Web Services: Protocolli SOAP Protocollo di comunicazione per la interazione sia C/S sia richiesta o risposta WSDL dialetto XML per la descrizione dei servizi che si possono richiedere ed ottenere UDDI Sistema di nomi per esportare ed importare le proprietà dei servizi disponibili insieme con altre estensioni Web Services 6 XML – vantaggi XML permette di conferire una struttura ad informazioni che sono tipicamente non strutturate (non significato) XML si aggiunge in modo indolore ai formati HTML cui si giustappone anche per documenti esistenti XML permette di omettere le informazioni di struttura (se esistenti e note) XML permette di riferire e considerare strumenti esterni per la validazione, trattamenti, e gestione del documento XML permette di riferire con tecniche di imbustamento documenti oggetto per un facile riferimento a strutture ripetute XML si è affermato come uno standard per la apertura di Servizi Web ad un uso generalizzato Web Services 7 SOAP (SIMPLE OBJECT ACCESS PROTOCOL) Protocollo SOAP per rispondere alla necessità di lavorare con protocolli Web ma permettendo di specificare e progettare e gestire componenti e operazioni Soluzione per introdurre parametri e valori nei messaggi e per l'invocazione remota di oggetti basati su tecnologie Web IPOTESI di PROGETTO - Uso di XML per serializzazione dei dati HTTP come protocollo di trasporto Esempio <SOAP-ENV:Envelope> <SOAP-ENV:Body> <m:GetLastTradePrice> <symbol>MOT</symbol> </m:GetLastTradePrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Web Services 8 SOAP (SIMPLE OBJECT ACCESS PROTOCOL) Protocollo SOAP Envelope incapsula il contenuto del messaggio Header destinato a contenere informazioni aggiuntive Informazioni accessorie di sicurezza Body incapsula le richieste e le risposte (in genere, il messaggio da comunicare) Fault incapsula eventuali casi distinti di errore ed eccezione Web Services 9 SOAP (SIMPLE OBJECT ACCESS PROTOCOL) Interazione C/S classica (fra mittente e destinazione), ma con ampia interoperabilità applicazione mittente Envelope SOAP applicazione destinazione Envelope Header ............ ............. Body <SOAP-ENV:Body <m:Get LastTradePrice xmlns:m="some-URI"> <m:symbol>IBM </ m:symbol> </ m:Get LastTradePrice> </SOAP-ENV:Body> Web Services 10 SOAP (SIMPLE OBJECT ACCESS PROTOCOL) Protocollo per comunicare dati: - Serializzando i dati in modo specifico (indipendentemente dalla piattaforma) - Operazioni leggere, robuste e flessibili - Supporto per tutte le architetture (.NET, J2EE, IBM WebSphere, Sun ONE) Web Services 11 SOAP (SIMPLE OBJECT ACCESS PROTOCOL) SOAP come protocollo specifica: • interaction style – document (interazione one-way) – RPC like • come si devono gestire gli elementi in XML • come si attua il solo trasporto NON i dettagli locali della interazione SOAP configura un protocollo stateless per la interazione senza fornire alcun supporto per informazioni semantiche sul contratto di interazione SOAP tende ad usare GET e POST come operazioni WEB Web Services 12 SOAP e ESECUZIONE: esempio Un semplice esempio: un’applicazione finanziaria (client) colloquia con un servizio che fornisce in tempo reale le quotazioni di borsa Questa interazione prevede la richiesta dell’ultima quotazione di una determinata azione e la risposta dal server Schema del colloquio: L’applicazione cliente costruisce una richiesta in XML usando la sintassi definita da SOAP L’applicazione cliente trasmette la richiesta ad un server Web usando HTTP Il server riceve ed interpreta la richiesta trasformandola in un comando che viene passato ad un’applicazione sul server L’applicazione sul server riceve il comando e ricava dal proprio database l’informazione richiesta (ad esempio) L’applicazione sul server crea una risposta, sempre in formato XML e la restituisce al server Web Il server Web la restituisce all’applicazione client come risposta HTTP Web Services 13 SOAP e XML (request) <POST /StockQuote/HTTP/1.1 Host: www.stockquoteserver.com Content-Type: text/xml; charset=”utf-8” Content-Length: nnnn SOAPAction: “Some-URI” <SOAP-ENV:Envelope xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/” SOAP_ENV:encodingStyle= ”http://schemas.xmlsoap.org/soap/encoding/> <SOAP-ENV:Body> <m:GetLastTradePriceRequest xmlns:m=”Some-URI”> <symbol>MOT</symbol> </m: GetLastTradePriceRequest> </SOAP-ENV:Body> Web Services 14 </SOAP-ENV:Envelope> SOAP e XML (response) <HTTP/1.1 200 OK Content-Type: text/xml; charset=”utf-8” Content-Length: nnnn <SOAP-ENV:Envelope xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/” SOAP-ENV: encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”> <SOAP-ENV:Body> <m:GetLastTradePriceResponse xmlns:m=”Some-URI”> <price>34.5</price> </m: GetLastTradePriceResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Web Services 15 SOAP e XML (errore) <HTTP/1.1 200 OK Content-Type: text/xml; charset=”utf-8” Content-Length: nnnn <SOAP:Envelope XMLns:SOAP="HTTP://schemas.XMLSOAP.org/SOAP/envelope" SOAP:encodingStyle= "HTTP://schemas.XMLSOAP.org/SOAP/encoding"> <SOAP:Body> <SOAP:Fault> <faultcode>Client</faultcode> <faultstring>Invalid Request</faultstring> <faultactor>unknown</faultactor> <detail>during the parameter …</detail> </SOAP:Fault> </SOAP:Body> Web Services 16 </SOAP:Envelope> Web Services Torniamo alla definizione iniziale Web Services Componenti software indipendenti dalla piattaforma e dall’implementazione che possono essere: – descritti usando un linguaggio di descrizione del servizio (WSDL) – invocati mediante un’API remota, solitamente tramite la rete (SOAP) – pubblicati in un registro di servizi (UDDI) Web Services 17 Web Services: WSDL Per i WS, oltre alla comunicazione… dobbiamo anche considerare di descrivere il servizio sia in modo astratto, sia in modo concreto WSDL (Web Services Description Language) Una proposta in XML per descrivere Web Services e per pubblicarli specificando esattamente il formato dei messaggi di richiesta e di risposta in modo portabile e standard e anche i dettagli WDSL si occupa di specificare: • cosa un servizio può fare (richieste, risposte e parametri) • dove risiede e lo si può invocare • come invocarlo Web Services 18 Web Services Description Language Se si vuole usare un Web service non noto – si richiede il file WSDL – si analizza il documento WSDL per determinare • locazione del servizio • chiamate dei metodi con i parametri • come accedere ai metodi – si crea una richiesta SOAP – si invia la richiesta SOAP al servizio e si attende la risposta La logica è quella di avere il massimo del supporto e della facilità nel procedere, fino alla completa automazione da parte di un middleware Alcune parti di WSDL sono molto simili a un IDL Web Services 19 Types (type information for the document, e.g., XML Schema) Message 1 Message 2 Operation 1 Message 3 Message 4 Message 5 Operation 2 Operation 3 Interface (abstract service) binding 1 binding 2 binding 3 binding 4 endpoint 1 endpoint 2 endpoint 3 endpoint 4 Service (the interface in all its available implementations) Message 6 Concrete description of the service WSDL document Abstract description of the service Elementi di base di WSDL Web Services 20 ARCHITETTURA DI WSDL v 2.0 WSDL descrive i Web Services iniziando con i messaggi da scambiare tra service Requestor e Provider I messaggi sono descritti a partire da una prospettiva astratta e poi in forma più concreta (protocollo e formato) Un messaggio consiste in una collezione di elementi tipati Uno scambio di messaggi è definito operation astratti Una collezione di operation è definita una interface (portType v. 1) Un service rappresenta l’implementazione di una interface e contiene una collezione di endpoint (port v. 1) concreti Un endpoint è l’implementazione concreta del servizio e include tutti i dettagli concreti necessari al verificarsi della comunicazione Un binding è il legame per richiedere le operazioni concrete Web Services 21 WSDL 2.0 WSDL descrive le parti astratte e concrete Web Services Descriptor Types Message ... Message Operation Service Interface Definition astratti Interface Binding Service Endpoint Endpoint Service Implementation Definition concreti Web Services 22 SERVIZIO in WSDL Un documento WSDL è formato da questi elementi in corrispondenza ad una parte dell’applicazione – Parti astratte Message, Operation, Interface – Parti concrete Type, Binding, Endpoint, Service WSDL definisce gli elementi astratti prima e poi le controparti concrete La versione astratta del servizio è generalizzabile, flessibile e facilmente estendibile Le specifiche concrete sono definite solo in ognuno degli elementi costituenti il servizio Web Services 23 Parti Astratte in WSDL • message informazione effettivamente inviata tra requestor e provider, con la possibile qualificazione del messaggio di input, output, o fault • operation specifica dei nomi delle operazioni, i parametri di input e output e consiste di messaggi • interface un insieme di operazioni astratte e di messaggi aventi un identificativo univoco che corrisponde al servizio stesso e che di solito si presenta in modo unico nel documento WSDL Web Services 24 Parti Concrete in WSDL • type tipo di dato in un messaggio usando XML Schema (inserita per prima) • binding per i dettagli dell’implementazione delle operazioni contenute in un’interface Specifica i protocolli concreti: trasporto e codifica dei dati (HTTP, SOAP; SMTP; FTP; …) • endpoint per indicare l’indirizzo di rete del servizio con cui effettuare la connessione • service come una collezione di endpoint correlati Permette di raggruppare tutte le interface, in modo che sia visibile quali siano gli endpoint supportati da un determinato servizio Ad esempio, tutti gli endpoint associati ad una transazione che richiede più passi Web Services 25 Web Services: WSDL types Una prima parte del WSDL descrive i tipi necessari per le operazioni <types> <schema> <element name="TradePriceRequest"> <complexType> <all> <element name="symbol" type="string"/> </all> </complexType> </element> <element name="TradePriceResponse"> <complexType> <all> <element name="price" type="float"/> </all> </complexType> </element> </schema> </types> Web Services 26 WSDL message, operation, e interface Troviamo la descrizione dei messaggi e operazioni: <message name="GetLastTradePriceInput"> <part name="body" element="xsd1:TradePriceRequest"/> </message> <message name="GetLastTradePriceOutput"> <part name="body" element="xsd1:TradePrice"/> </message> Ogni operazione è costituita da un messaggio di richiesta e uno di risposta raggruppate in interface <interface name="StockQuoteInterface"> <operation name="GetLastTradePrice"> <input message="tns:GetLastTradePriceInput"/> <output message="tns:GetLastTradePriceOutput"/> </operation> </interface> Web Services 27 WSDL binding Il binding come collegamento tra un tipo di operazione (type), un nome di operazione (name) e l’azione da eseguire (soapAction): <binding name="StockQuoteSoapBinding“ type="tns:StockQuoteInterface"> <soap:binding> <operation name="GetLastTradePrice“> <soap:operation soapAction="http://lia.deis.unibo.it/soap/bin/"/> <input><soap:body use=“literal”/><input> <output><soap:body use=“literal”/></output> </operation> </binding> Si riferiscono le implementazioni concrete Web Services 28 WSDL endpoint e service L’ultima parte del documento descrive il servizio e l’indirizzo Web da utilizzare per accedere: <service name="StockQuoteService"> <documentation> Servizio di quotazione azioni </documentation> <endpoint name="StockQuoteEndPoint" binding="tns:StockQuoteBinding"> <soap:address location="http://www.stockquote.com"/> </endpoint> </service> Oltre a ultimi dettagli concreti Web Services 29 Uso di WSDL WSDL può essere usato: • come descrizione del contratto di servizio IDL • come IDL di partenza per compilare lo stub (lato Client) WSDL of service provider 1 2 WSDL compiler (client side) WSDL generator WSDL compiler (server side) service requestor service provider application object (client) application object (service provider) stub skeleton SOAP-based middleware SOAP-based middleware SOAP messages Web Services 30 Esercizi Web Services 31 Preparazione ambiente di lavoro 1. Scaricare il file esercitazioneWS.zip, decomprimerlo e portarsi nel direttorio appena creato (esercitazioneWS) 2. Aprire il file setupEnv.bat e modificare la prima parte inserendo i dati relativi al proprio ambiente di lavoro • LAB_HOME=<percorso completo fino a esercitazioneWS> 3. Lanciare setupEnv.bat da shell DOS (questo termina la preparazione dell’ambiente di lavoro Web Services 32 Servizio EchoInterface: interfaccia Java /* Data la nostra familiarità con Java RMI vediamo come sarebbero i metodi remoti dichiarati da un’interfaccia remota RMI */ public interface EchoInterface extends java.rmi.Remote { public String echoString(String in0) throws RemoteException; public String appendString(String in0, String in1) throws RemoteException; public int somma(int in0, int in1) throws RemoteException; } … anche possibile generazione automatica di WSDL da interfaccia Java con opportuni compilatori (es., AXIS Java2WSDL) Web Services 33 EchoInterface WSDL: WSDL Types // Ora invece vediamo il relativo WSDL <wsdl:message name="sommaRequest"> <wsdl:part name="in0" type="xsd:int"/> <wsdl:part name="in1" type="xsd:int"/> </wsdl:message> <wsdl:message name="sommaResponse"> <wsdl:part name="sommaReturn" type="xsd:int"/> </wsdl:message> <wsdl:message name="appendStringRequest"> <wsdl:part name="in0" type="soapenc:string"/> <wsdl:part name="in1" type="soapenc:string"/> </wsdl:message> <wsdl:message name="echoStringResponse"> <wsdl:part name="echoStringReturn" type="soapenc:string"/> </wsdl:message> <wsdl:message name="echoStringRequest"> <wsdl:part name="in0" type="soapenc:string"/> </wsdl:message> <wsdl:message name="appendStringResponse"> <wsdl:part name="appendStringReturn" type="soapenc:string"/> </wsdl:message> Web Services 34 EchoInterface WSDL: interfaccia (portType in WSDL v. 1) <wsdl:portType name="EchoInterface"> <wsdl:operation name="echoString" parameterOrder="in0"> <wsdl:input message="impl:echoStringRequest" name="echoStringRequest"/> <wsdl:output message="impl:echoStringResponse" name="echoStringResponse"/> </wsdl:operation> <wsdl:operation name="appendString" parameterOrder="in0 in1"> <wsdl:input message="impl:appendStringRequest" name="appendStringRequest"/> <wsdl:output message="impl:appendStringResponse“ name="appendStringResponse"/> </wsdl:operation> <wsdl:operation name="somma" parameterOrder="in0 in1"> <wsdl:input message="impl:sommaRequest" name="sommaRequest"/> <wsdl:output message="impl:sommaResponse" name="sommaResponse"/> </wsdl:operation> </wsdl:portType> Web Services 35 EchoInterface WSDL: binding <wsdl:binding name="EchoServiceSoapBinding“ type="impl:EchoInterface"> <wsdlsoap:binding style="rpc transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="echoString"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="echoStringRequest"> <wsdlsoap:body encodingStyle=http://schemas.xmlsoap.org/soap/encoding/ namespace="urn:EsempioEchoService" use="encoded"/> </wsdl:input> <wsdl:output name="echoStringResponse"> <wsdlsoap:body encodingStyle=http://schemas.xmlsoap.org/soap/encoding/ namespace="urn:EsempioEchoService" use="encoded"/> </wsdl:output> </wsdl:operation> ... </wsdl:binding> Web Services 36 EchoInterface WSDL: service e endpoint (port in WSDL v. 1) <wsdl:service name="EchoInterfaceService"> <wsdl:port binding="impl:EchoServiceSoapBinding" name="EchoService"> <wsdlsoap:address location= "http://137.204.45.59:8079/axis2/services/EchoService"/> </wsdl:port> </wsdl:service> Web Services 37 Invocazione EchoInterface WS in Java In questa esercitazione usiamo le librerie Apache AXIS Offrono un insieme di strumenti di supporto per lo sviluppo di WS in Java (sia lato Client, sia lato Server) In questa esercitazione ci concentriamo solo sul client In particolare, vediamo due diverse modalità di implementazione: – Costruzione diretta della chiamata – Generazione automatica di codice (compilatore WSDL2Java) e uso dello stub per l’invocazione remota Web Services 38 Astrazioni e Strumenti offerti da Apache AXIS La libreria AXIS offre diverse astrazioni per semplificare il processo di sviluppo di WS nel mondo Java – Service: il generico WS – Call: la singola invocazione (RPC like) di una operazione remota – QName: un “qualified name XML” composto da un URL che indica il namespace XML di riferimento e un nome locale all’interno di tale namespace Inoltre… strumenti per la creazione automatica dello stub del client: WSDL2Java Web Services 39 ClientCostruzioneChiamata.java 1/2 import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class ClientCostruzioneChiamata { public static void main(String[] args) { try { String endpoint = // Preparo l’endpoint che voglio contattare come URL completo "http://137.204.45.59:8079/axis/services/EchoService"; Service service = new Service(); Call call = (Call) service.createCall(); // Creo la chiamata // Inizializzo la chiamata indicando l’endpoint al quale mi voglio collegare call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName( // QName è il qualified name XML che punta alla operazione richiesta // all’interno del WSDL new QName("http://137.204.45.59:8079/axis/services/EchoService", "echoString") ); Web Services 40 ClientCostruzioneChiamata.java 2/2 /* Nella invoke indico i parametri di uscita come array di Object Java * NOTA: il supporto AXIS (al momento di invocazione della invoke) * effettua diverse operazioni di supporto * 1) conversione input da formato locale (Java) a formato testuale serializzato XML; * 2) imbustamento e invio richiesta SOAP; * 3) ricezione e e estrazione risposta SOAP; * 4) conversione output da formato testuale serializzato XML a formato locale (Java); */ String ret = (String) call.invoke(new Object[]{"Hello!"} ); System.out.println("Ecco il risultato: " + ret); } catch (Exception e) { System.err.println(e.toString()); } } } // main // ClientCostruzioneChiamata Web Services 41 Compilazione ed Esecuzione per passi 1. Spostarsi nella cartella dove si trovano i sorgenti: > cd src 2. Compilazione: > java ClientCostruzioneChiamata.java 3. Eseguire il client: > java ClientCostruzioneChiamata Proviamo a invocare altri servizi, ripetendo i passi 2 e 3 Web Services 42 ClientChiamataConStub.java import java.net.URL; import org.apache.axis.client.Service; import EsempioEcho.EchoServiceSoapBindingStub; public class ClientChiamataConStub { public static void main(String[] args) { try // Uso il client stub creato automaticamente attraverso dal compilatore WSDL2Java { EchoServiceSoapBindingStub service = new EchoServiceSoapBindingStub( // Devo solo indicare l’endpoint, come URL new URL("http://137.204.45.59:8079/axis/services/EchoService"), new Service()); // Lo stub espone le operazioni remote come metodi invocabili // localmente Æ come Stub RMI String result = service.echoString("Hello!"); System.out.println("Ecco il risultato: " + result); } catch (Exception e) { System.err.println(e.toString()); } } // main } // ClientChiamataConStub Web Services 43 Compilazione ed Esecuzione per passi 1. Spostarsi (se non ci siamo già) nella cartella dove si trovano i sorgenti: > cd src 2. Compilazione stub usando il file (.bat) generateClasses.bat > generateClasses.bat EchoService.wsdl 3. Compilazione client > java ClientChiamataConStub.java 4. Eseguire il client: > java ClientChiamataConStub Proviamo a invocare altri servizi, ripetendo i passi 3 e 4 Web Services 44