Corso di Modelli e Applicazioni in Reti di Calcolatori L-S

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