Web Services Programmazione in ambienti distribuiti Anno 2004-2005 Claudio Zunino Classificazione dei Web Services Interattiva il client è umano ed utilizza tipicamente un web browser Sviluppati usando Servlets/JSP/... application-to-application dove il client è un programma che interagisce con un altro programma Descritti di seguito... Web services combinano il protocollo HTTP e l XML come formato per i dati In questo modo sfruttano i vantaggi di entrambe le tecnologie. 1
Definizione di Web Services "I Servizi Web sono componenti di software riutilizzabili, debolmente accoppiati che incapsulano semanticamente le funzionalità discrete e sono programmaticamente accessibili e distribuiti su e dai protocolli standard di Internet." Componenti riutilizzabili I Servizi Web proseguono nella lunga ascensione del progetto di oggetti distribuiti nello sviluppo del software. Piuttosto di richiedere ai programmatori di scrivere un insieme di istruzioni dall'inizio alla fine, una dopo l'altra, il modello basato su componenti premette agli sviluppatori di riutilizzare i blocchi di costruzione di codice creati da altri, per assemblarli, adattarli ed estenderli, a seconda delle esigenze. 2
Debolmente accopiati Il progetto di un'applicazione tradizionale dipende da un'interconnessione stretta tra tutti gli elementi utilizzati. La complessità di queste interconnessioni richiede che gli sviluppatori comprendano appieno ed abbiano un totale controllo su entrambe i lati della connessione. Inoltre, una volta che tale connessione venga stabilita, sarà estremamente difficile estrarre un elemento e rimpiazzarlo con un altro. Sistemi debolmente accoppiati richiedono un livello di coordinazione assai semplificato, e permettono una riconfigurazione più flessibile. Autodescrizione "incapsulano semanticamente la funzionalità discreta". Un Servizio Web si presenta come un applicazione autonoma che effettua una singola operazione. La componente descrive i propri input ed output in modo che ogni altro software possa determinare cosa fa il servizio, come invocare le sue funzionalità e quale risultato si aspetta di ritorno. 3
Accessibili da programmi "sono accessibili programmaticamente". Diversamente dalle applicazioni per siti Web e desktop, i Servizi Web non sono stati progettati per una diretta interazione umana, quindi non hanno un'interfaccia grafica. Piuttosto operano a livello di codice poiché sono chiamati per lo scambio di dati con altri software. Protocolli molto conosciuti "distribuiti su Internet". Infatti fanno uso di protocolli esistenti di grande diffusione come HTTP. Supportandoli, i Servizi Web fanno leva sulle infrastrutture già esistenti e possono conformarsi alle politiche dei firewall aziendali correnti. 4
WSDL, SOAP, UDDI La piattaforma Web Services usa: SOAP Acronimo per: Simple Object Access Protocol un framework per lo scambio di informazioni in una rete, basato su XML "This is no longer the case." (it is neither simple nor has anything to do with objects) WSDL Acronimo per: Web Service Description Language Un linguaggio basato sull XML per descrivere servizi sulla rete Il WSDL descrive sia le possibilità che la posizione dei servizi Può essere visto come un linguaggio per la descrizione delle interfacce di Web services UDDI Acronimo per: Universal Description, Discovery, and Integration Fornisce un meccanismo affinchè client e server possano trovarsi Usa SOAP per le comunicazioni WSDL I WSDL è un linguaggio basato sull XML che permette una descrizione formale delle interfacce dei Web Services Quale interazione offre il servizio Quali argomenti e risultati sono utilizzati nell interazione Quale indirizzo di rete viene usato per individuare il service Quale protcollo di comunicazione bisogna usare Con quale formato sono rappresentati I messaggi Vantaggi L interfaccia è come se fosse un contratto tra gli sviluppatori del server e quelli del client Avere una descrizione formale permette l uso di strumenti automatici, per esempio per generare codice (progetto Apache AXIS) 5
WSDL II Un File WSDL può essere visto come composto da due parti: Il livello di definizione del servizio per descrivere proprietà astratte Tipo dei dati Tipo dei messaggi Operazioni Servizi Il livello per il binding per descrivere proprietà più concrete : Protocolli Formati dei dati Esempio di WSDL I <?xml version="1.0" encoding="utf-8"?> <definitions name="myhelloservice" targetnamespace="urn:foo" xmlns:tns="urn:foo" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> <types/> <message name="helloif_sayhello"> <part name="string_1" type="xsd:string"/></message> <message name="helloif_sayhelloresponse"> <part name="result" type="xsd:string"/></message> <porttype name="helloif"> <operation name="sayhello" parameterorder="string_1"> <input message="tns:helloif_sayhello"/> <output message="tns:helloif_sayhelloresponse"/></operation></porttype> 6
Esempio di WSDL II <binding name="helloifbinding" type="tns:helloif"> <operation name="sayhello"> <input> <soap:body encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="urn:foo"/></input> <output> <soap:body encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="urn:foo"/></output> <soap:operation soapaction=""/></operation> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/></binding> <service name="myhelloservice"> <port name="helloifport" binding="tns:helloifbinding"> <soap:address location="http://localhost:8080/hello-jaxrpc/hello"/> </port></service></definitions> SOAP Usare SOAP significa: Quando bisogna spedire un messaggio, bisogna includerlo in un involucro ( envelope ) SOAP Quando si riceve uno di questi messaggi, estrarne il contenuto dall involucro SOAP Un envelope contiene: un header (facoltativo) che contiene informazioni sul messaggio un body che contiene la parte significativa del messaggio 7
Esempio di SOAP <?xml version='1.0'?> <env:envelope xmlns:env="http://www.w3.org/2002/06/ soap-envelope"> <env:header> Intestazione </env:header> <env:body> Contenuto </env:body> </env:envelope> UDDI UDDI: un meccanismo per registrare Web Services UDDI business registration: file XML usati per descrivere, per esempio, i servizi offerti nel campo business Pagine bianche indirizzi, contatti, info, etc. Pagine gialle orientate alle industrie Pagine verdi informazioni più tecniche, per esempio descrizioni in WSDL UDDI fornisce anche una serie di API basate su SOAP+WSDL per registrare ("publish") and scoprire ("inquire") Web services. 8
Unatipicasessione SOAP message <element name= Customer > <element name= account > </element> 1 Service description using WSDL Service provider 4 Directory SOAP message <element name= Customer > <element name= account > </element> SOAP message <m: GetCustomerInfInfo> <account>220</account> </m GetCustomerInfo> XML service request XML service response <m: GetCustomerInfInfo> <account>220</account> </m GetCustomerInfo> SOAP message Service description using WSDL 5 3 Directory queries 2 Service consumer Apache ant E un tool basato su Java per la compilazione di programmi Java Utilizza un file XML per la compilazione di un progetto. Ogni build.xml contiene un progetto e almeno un target (es. compile, build, dist, deploy...) 9
Apache ant Utilizza delle librerie di Tomcat per eseguire in automatico diverse operazioni Installazione di web application Disinstallazione di web application Nell esempio compila un client stub raggiungendo il WSDL Esempio di build.xml <project name="myproject" default="dist" basedir="."> <description> simple example build file </description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/> <property name="dist" location="dist"/> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build"/> </target> 10
Esempio di build.xml <target name="compile" depends="init" description="compile the source " > <!-- Compile the java code from ${src into ${build --> <javac srcdir="${src" destdir="${build"/> </target> <target name="clean" description="clean up" > <!-- Delete the ${build and ${dist directory trees --> <delete dir="${build"/> <delete dir="${dist"/> </target> </project> Esempio di service I Interfaccia HelloIF package helloservice; import java.rmi.remote; import java.rmi.remoteexception; public interface HelloIF extends Remote { public String sayhello(string s) throws RemoteException; 11
Esempio di service II Classe HelloImpl package helloservice; public class HelloImpl implements HelloIF { public String message ="Hello "; public String sayhello(string s) { return message + s; Esempio di client statico import javax.xml.rpc.stub; public class HelloClient { private String endpointaddress; public static void main(string[] args) { try { Stub stub = createproxy(); stub._setproperty (javax.xml.rpc.stub.endpoint_address_property, args[0]); HelloIF hello = (HelloIF)stub; System.out.println(hello.sayHello("Duke!")); catch (Exception ex) { ex.printstacktrace(); private static Stub createproxy() { // Note: MyHelloService_Impl is implementation-specific. return (Stub) (new MyHelloService_Impl().getHelloIFPort()); 12
Esempio di client dinamico I public class HelloClient { public static void main(string[] args) { try { String UrlString = args[0] + "?WSDL"; String namespaceuri = "urn:foo"; String servicename = "MyHelloService"; String portname = "HelloIFPort"; System.out.println("UrlString = " + UrlString); URL hellowsdlurl = new URL(UrlString); ServiceFactory servicefactory = ServiceFactory.newInstance(); Esempio di client dinamico II Service helloservice = servicefactory.createservice(hellowsdlurl, new QName(nameSpaceUri, servicename)); dynamicproxy.helloif myproxy = (dynamicproxy.helloif) helloservice.getport( new QName(nameSpaceUri, portname), dynamicproxy.helloif.class); System.out.println(myProxy.sayHello("Buzz")); catch (Exception ex) { ex.printstacktrace(); 13
Riferimenti J2EE 1.4 http://java.sun.com/j2ee/1.4/download.ht ml Tutorial http://java.sun.com/j2ee/1.4/docs/tutorial/ doc/index.html 14