Facoltà di Ingegneria - Università degli studi di Catania Dipartimento di Ingegneria Informatica e delle Telecomunicazioni Java Web Services Giovanni Morana Agenda Web Services Service Oriented Architecture – SOA XML (cenni) Simple Object Access Protocol - SOAP Web Services Description Language -WSDL Universal Description, Discovery and Integration – UDDI (cenni) Busine Proces Execution Language for WS - BPEL4WS Sun Java WS API J2EE J5EE Glassfish and METRO project Apache AXIS Architettura Deploy dei servizi Invocazione dei servizi Java Web Services Service-Oriented Architecture In computing, the term service-oriented architecture expresses a perspective of software architecture that defines the use of loosely coupled software services to support the requirements of the business processes and software users. In an SOA environment, resources on a network are made available as independent services that can be accessed without knowledge of their underlying platform implementation. “Migrating to a service-oriented architecture”, IBM DeveloperWorks Java Web Services SOA: caratteristiche base Interfacce indipendenti dall’implementazione ogni servizio deve essere descritto in maniera indipendente dal linguaggio e dalla piattaforma utilizzati per la sua realizzazione Reperibilità e binding dinamico un servizio deve poter essere ricercato tramite gli elementi dell’interfaccia esposta e richiamato a run time Accessibilità da rete garantisce la trasparenza rispetto alla locazione Java Web Services SOA: caratteristiche base Loosely coupled services servizi debolmente accoppiati garantiscono semplicità di gestione Aggragabilità più servizi possono essere composti per portare a termine un particolare task Gestione dei Fault ogni servizio dovrebbe essere in grado di rilevare eventuali errori e notificarli e/o intraprendere azioni correttive Java Web Services SOA: attori Service Provider rende disponibile il servizio, ne espone l’interfaccia e la pubblica su uno specifico registry Service Requestor/Consumer utilizza il servizio tramite l’interfaccia esposta dal provider, ottenuta tramite queries ad un service registry Service Registry/Broker, colleziona le informazioni relative ai servizi/provider e le mette a disposizione dei requestor/consumer Java Web Services SOA: funzionalità Descrizione del servizio illustra le “operazioni” che il servizio puo’ svolgere, le inquadra in specifici end-point e fornisce le modalità per l’accesso Ricerca del servizio meccanismo per la pubblicazione e la ricerca delle informazioni. Scambio di messaggi protocollo per la codifica ed il trasporto dei dati Java Web Services SOA REGISTRY CONSUMER PROVIDER Java Web Services Web Services Secondo la definizione del W3C: Web Services are a software applications identified by a URI, whose interface and bindings are capable of being identified, described and discovered by XML artifacts and supports direct interactions with other software applications using XML based messages via Internet-based protocols” Costituiscono una particolare incarnazione SOA di cui mantengono le principali proprietà Java Web Services WS: tecnologie di base XML (eXtensible Markup Language) Utilizzato per la definizione delle interfacce e la codifica dei messaggi SOAP (Simple Object Access Protocol) Protocollo utilizzato per lo scambio di messaggi WSDL (Web Service Description Language) Utilizzato per la descrizione formale delle interfacce WS UDDI (Universal Description Discovery and Integration) Registry utilizzato per la registrazione, catalogazione e ricerca dei WS BPEL (Business Process Execution Language) Linguaggio per la descrizione di interazioni tra ws multipli Java Web Services WS: tecnologie di base REGISTRY UDDI SO AP AP SO WSDL CONSUMER PROVIDER SOAP Java Web Services XML L’eXtensible Markup Language è un metalinguaggio che permette di definire informazioni di tipo strutturale e semantico. Descrive le interfacce dei WS, ne codifica i messaggi e determina la validità dei dati. SOAP, WSDL, UDDI e BPEL sono XML-based E’ in formato testuale: -garantisce l’interoperabilità tra piattaforma eterogenee -necessità di un parser per l’interpretazione di tag non standard che ne inficia le prestazioni Java Web Services XML Intestazione standard <?xml version="1.0"?> Definizione di componente strutturato <dottorando> <nome>Giovanni</nome> <cognome>Morana</cognome> <indirizzo_email> [email protected] </indirizzo_email> </dottorando> Definizione di componente composto <Lista XXI ciclo> <dottorando> <nome>Giovanni</nome> <cognome>Morana</cognome> <indirizzo_email> [email protected] </indirizzo_email> </dottorando> <dottorando> <nome>Daniele</nome> <cognome>Zito</cognome> <indirizzo_email> [email protected] </indirizzo_email> </dottorando> </Lista XXI ciclo> Java Web Services XML Permette all'utente di definire TAG specifici per il contesto applicativo. I TAG utente vengono definiti in documenti detti DTD I DTD sono utilizzati per garantire che ogni entità in gioco abbia una rappresentazione coerente della struttura del documento analizzato. L'utilizzo rigoroso dei TAG permette di definire se un documento è well formed definire se un documento è valido Java Web Services XML: XML Schema & namespaces XML Schema E’ una collezione di elementi definiti in XML che definisce la grammatica di un documento XML specificando i tag utilizzati, gli attributi e i valori associabili ai tag e le relazioni tra tag diversi. XML Namespace Permette l’utilizzo contemporaneo di più XML Schema nello stesso documento risolvendo a priori qualsiasi problema di collisione dovuto a elementi omonimi. Java Web Services SOAP Simple Object Access Protocol è un protocollo di comunicazione basato sullo scambio di messaggi unidirezionale e stateless utilizzato per l’integrazione di sistemi distribuiti eterogenei. Si fonda su tecnologie molto diffuse quali HTTP, SMTP, FTP per il trasporto e XML per la codifica dei dati. SOAP è molto potente ed è uno strumento fondamentale per lo sviluppo dei WS ma può essere utilizzato stand alone per lo scambio di messaggi (JAXM) SOAP 1.2 [raccomandazione W3C] Java Web Services SOAP: specifiche Le specifiche SOAP stabiliscono: z Come XML deve essere codificato per rappresentare il contenuto del singolo messaggio z Come HTTP e SMTP possono utilizzare messaggi SOAP per comunicare z Come due messaggi devono essere combinati per ottenere uno scambio di tipo request-replay z Le regole necessarie al “ricevente” per il processamento del contenuto XML del messaggio Java Web Services SOAP: specifiche z Remote Procedure Call. I WS possono essere invocati come chiamata a procedura remota. Il messaggio associato contiene informazioni relative al nome e ai parametri della procedura. Utilizzato per applicazioni sincrone. Richiesta e risposta sono realizzati tramite lo scambio di due messaggi distinti z Document Oriented. Il messaggio trasporta un insieme di dati codificati in XML che vanno processati come parte di un unico “documento”. Usato per messaggi asincroni di notifica. Java Web Services SOAP: message SOAP envelope SOAP body SOAP header block SOAP body block SOAP header block SOAP body block SOAP fault SOAP header envelope:identifica il documento XML come un messaggio soap header (?): contiene informazioni specifiche per l’applicazione a cui viene destinato body: contiene tutte le informazioni scambiate fault (?): gestisce eventuali errori in fase di decodifica del messaggio Nessun collegamento a DTD/Nessuna istruzione di processamento XML Elementi definiti nel namespace XML “soap-envelope” del W3C. Java Web Services SOAP: message envelope header body fault <SOAP-ENV:Envelope xmlns:SOAP-ENV=“http://schemas.xmlsoap.org/soap/envelope/” xmlns:xsi=“http://www.w3.org/1999/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/1999/XMLSchema”> <SOAP-ENV:Header> </SOAP-ENV:Header> <SOAP-ENV:Body> <m:MetodoXY-Z xmlns:m=“provider:servizio” SOAP-ENV:encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”> <Param1>X</Param1> <Param2>Y</Param2> </m:nomeMetodo> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Java Web Services SOAP: elemento header z E’ opzionale z Contiene informazioni utili alla gestione del messaggio: sicurezza, gestione di credenziali, routing, identificativi di transazioni z Permette al messaggio di essere riconosciuto senza che sia necessario la lettura del contenuto. Può contenere SOAP-ENV:MustUnderstand, elemento booleano che impone al ricevente di generare un errore nel caso non sia in grado di interpretare uno specifico elemento <xs: elemento SOAP-ENV: MustUnderstand=“true”> z Java Web Services SOAP: elemento body Contiene il messaggio “vero e proprio” Poiché le specifiche SOAP definiscono per body il solo elemento figlio fault, è necessario definire un namespace al suo interno. Solitamente tale namespace è associato al file wsdl del web service invocato in quanto gli elementi definiti all’interno di body sono quelli contenuti nel wsdl. Può contenere una richiesta, una risposta o l’indicazione di errore Può contenere un insieme di body block e un solo body fault Java Web Services SOAP: elemento body public class Prova {public int MetodoXY-Z(int X, int Y){return Z=f(X;Y);}} <SOAP-ENV:Body> <m:MetodoXY-Z xmlns:m=“provider:Prova” SOAP-ENV:encodingStyle=“http://..soapencoding”> <Param1>X</Param1> <Param2>Y</Param2> </m:MetodoXY-Z> </SOAP-ENV:Body> Java Web Services SOAP: elemento <fault> z E’ opzionale z Viene utilizzato per notificare errori <fault> <faultcode> <faultstring> <faultactor> <details> <faultcode> (namespace qualified) contiene indicazione di errori interpretabili automaticamente dagli algoritmi. (<faultstring> contiene le stesse informazioni in formato “umano”) <faultactor> identifica il nodo che ha generato l’errore (URI) <details> contiene informazioni dettagliate sugli errori generati durante il processamento dei blocchi body Java Web Services SOAP: invio messaggio su HTTP POST /MyApplication HTTP/1.1 Host: www.provider.net Content-Type: text/xml text/xml; charset=“utf-8” SOAPAction: “urn:provider:Prova#Metodo” <SOAP-ENV:Envelope <SOAP-ENV:Header> … </SOAP-ENV:Header> <SOAP-ENV:Body> <m:MetodoXY-Z xmlns:m=“provider:Prova” SOAP-ENV:encodingStyle=“http://...soapencoding/”> <Param1>X</Param1> <Param2>Y</Param2> </m:MetodoXY-Z> </SOAP-ENV:Body> </SOAP-ENV:Envelope> SOAPAction è l’elemento di congiunzione. Java Web Services WSDL Web Services Description Language è un linguaggio XML-based utilizzato per descrivere un servizio e le modalità per accedere ad esso. (what) Descrizione servizio. Descrive le funzionalità e il tipo di servizio offerto. (how) Binding concreto. Descrive come viene realizzato il collegamento dell’interfaccia con i protocolli concreti (where) Implementazione. Descrive attraverso quale porta si realizza il binding. Porta = punto di accesso Java Web Services WSDL: elementi principali <types> definizione dei tipi di dato utilizzati <message> definizione/descrizione dei messaggi usati nella comunicazione <portType> definisce le operazioni che il ws può eseguire e i messaggi coinvolti in queste operazioni <binding> definisce il formato del messaggio e i dettagli di protocollo per ogni PortType definito <operation> descrizione delle singole operazioni supportate dal ws <service> collezione di end-point associate ai portType <port> singolo end-point espresso come coppia binding-indirizzo di rete Java Web Services WSDL: elementi principali WSDL types messages portType operation binding operation service port Java Web Services WSDL: elementi principali WSDL types messages portType operation binding operation service port what? Java Web Services WSDL: elementi principali WSDL types type messages portType operation binding operation service port what? how? Java Web Services WSDL: elementi principali WSDL types messages portType operation binding operation service port what? how? where? Java Web Services WSDL: elementi principali WSDL types messages portType operation descrizione astratta binding operation service port descrizione concreta Java Web Services WSDL: <types> All’interno del tag <types> vengono definiti tutti i tipi di dato coinvolti nelle operazioni esposte dal ws. Per facilitare le definizioni ed essere platform independent, WSDL utilizza l’XML Schema syntax Java Web Services WSDL : <message> Definisce i messaggi scambiati tra ws e cliente. <wsdl:message name=“Metodo1Request"> <wsdl:part name="x" type="xsd:int"/> </wsdl:message> <wsdl:message name=“Metodo1Response"> <wsdl:part name=“valRitorno" type="xsd:int"/> </wsdl:message> Il tag <part> descrive il nome ed il tipo di variabili utilizzati dallo specifico messaggio (parametri funzione). Poiché ogni messaggio è una composizione dei tipi definiti in <types> ,e’ necessario che ogni variabile descritta in part sia specificata all’interno di <types> Java Web Services WSDL : <portType> E’ l’elemento più importante perché definisce: -le operazioni disponibili -i messaggi coinvolti nelle singole operazioni Concettualmente simile ai file .h (header) in C. <wsdl:portType name=“servClass"> <wsdl:operation name=“Metodo1" /> <wsdl:input message="impl:Metodo1Request" name=“Metodo1Request"/> <wsdl:output message="impl:Metodo1Response" name="Metodo1Response"/> </wsdl:operation> </wsdl:portType> Java Web Services WSDL : <portType> Il WSDL permette quattro tipi di operazioni: One-way: il servizio riceve un messaggio ma non prevede l’invio di una risposta. Request- Response: il servizio riceve una richiesta a cui risponde con un messaggio di risposta Sollicit- Response: Il servizio invia un messaggio e attende una risposta Notification: il servizio invia un messaggio ma non attende messaggi di risposta Ogni operazioni può essere costituita da un messagio di input (one-way) di output (notification) o da entrambi: in quest’ultimo caso è possibile specificare un ulteriore massaggio di fault Java Web Services WSDL : <Binding> Lega la descrizione del WS (portType) con il protocollo SOAP, definendo, per ogni operazione, lo stile e il protocollo utilizzato per la fruizione del servizio. <wsdl:binding name=“servClassSoapBinding" type="impl:servClass"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name=“Metodo1"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="PariRequest"> <wsdlsoap:body encodingStyle="http://… /soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/> </wsdl:input> <wsdl:output name="PariResponse"> <wsdlsoap:body encodingStyle="http://… /soap/encoding/" namespace="http://localhost:8080/axis/service.jws" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> Java Web Services WSDL : <Binding> Lega la descrizione del WS (portType) con il protocollo SOAP, definendo, per ogni operazione, lo stile e il protocollo utilizzato per la fruizione del servizio. <wsdl:binding name=“servClassSoapBinding" type="impl:servClass"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name=“Metodo1"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="PariRequest"> <wsdlsoap:body encodingStyle="http://… /soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/> </wsdl:input> <wsdl:output name="PariResponse"> <wsdlsoap:body encodingStyle="http://… /soap/encoding/" namespace="http://localhost:8080/axis/service.jws" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> Java Web Services WSDL : <Binding> Lega la descrizione del WS (portType) con il protocollo SOAP, definendo, per ogni operazione, lo stile e il protocollo utilizzato per la fruizione del servizio. <wsdl:binding name=“servClassSoapBinding" type="impl:servClass"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name=“Metodo1"> <wsdlsoap:operation soapAction=""/> <wsdl:input name=“Metodo1Request"> <wsdlsoap:body encodingStyle="http://… /soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/> </wsdl:input> <wsdl:output name=“Metodo1Response"> <wsdlsoap:body encodingStyle="http://… /soap/encoding/" namespace="http://localhost:8080/axis/service.jws" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> Java Web Services WSDL : <services> & <port> Descrive i dettagli relativi alle relazioni tra servizio : end points : locazione <wsdl:service name=“ProvaService"> <wsdl:port binding="impl:ProvaSoapBinding" name=“MetodoXY-Z"> <wsdlsoap:address location="http://localhost:8080/axis/Prova.jws"/> </wsdl:port> </wsdl:service> Java Web Services UDDI L’UDDI (Universal Description, Discovery and Integration) è un registry XML based su cui è possibile la pubblicazione (server), la ricerca e l’interrogazione (client) di Web Services. - Gestisce i dati contenuti nel WSDL dei diversi servizi - Interagisce con provider/requestor attraverso messaggi SOAP White pages: fornisce informazioni relative ai provider Yellow pages: fornisce una catalogazione basata su caratteristiche specifiche dei servizi Green pages: fornisce informazioni tecniche sui servizi offerti dallo specifico provider Java Web Services UDDI Informazioni gestite dall’UDDI BusinessEntity Informazioni non tecniche relative al provider. Utilizzata dai servizi white pages BusinessService Informazioni non tecniche relative ai servizi implementati da un daterminato provider. Contiene il nome del servizio, la descrizione e un eventuale costo. Utilizzato dai servizi yellow pages BindingTemplate Mantiene associazioni Service-tModel, fornendo informazioni su come accedere ad un servizio con un determinato tModel (green pages) tModel (technical Model) Contiene le informazioni tecniche, come il wsdl del servizio associato (green pages) Java Web Services BPEL Business Process Execution Language Nasce da OASIS nel 2003 dalla standardizzazione di un linguaggio nato dall'integrazione delle ricerche svolte da IBM (WSFL) e Microsoft (XLANG) E' un linguaggio utilizzato per la descrizione formale dei compiti assolti dai componenti costitutivi di processi distribuiti. BPEL un linguaggio XML-based che supporta tutte le tecnologie dello stack WS quali SOAP, WSDL, UDDI, WS-Reliable Messaging, WS-Addressing, WS-Coordination e WS-Transaction. Utilizzato nelle applicazioni tipo “programming in the large” Nei sistemi WS based, tale standard prende il nome di BPEL4WS o WSBPEL Java Web Services BPEL Il BPEL è un linguaggio per il WS Orchestration. WS – Orchestration Viene utilizzato per l'implementazione di procedure di esecuzione di processi distribuiti . Definisce la sequenza delle operazioni. WS – Choreography Viene utilizzato per la specifica della sequenza di messaggi scambiati per l'esecuzione di processi distribuiti. Definisce il protocollo. Java Web Services BPEL Il BPEL specifica l'ordine esatto con cui i WS che partecipano al processo coordinato devono essere invocati. Ogni processo può contenere variabili, cicli, istruzioni condizionali e meccanismi per la gestione dei fault. Combinando tutti questi costrutti è possibile definire un processo quanto si voglia complesso in modo simile a quello che avviene nella costruzione di algoritmi nei linguaggi di programmazione tradizionali Un tipico Processo BPEL consiste in un messaggio di request mandato dal client dell'intero processo al sistema di coordinamento. Il sistema si occupa di invocare in modo trasparente all'utente tutti i WS coinvolti e restituire il valore dell'intero processo di elaborazione Java Web Services BPEL Ogni processo BPEL è diviso in step. Ogni step è detto “attività”. Basic activity: attività semplice composta da una singola istruzione <invoke> invocazione WS <receive> attesa di uuna request da un WS client <reply> risposta per processi sincroni <throw> permette di gestire eccezioni <assign> manipolazione variabili Structured Activity: permette di combinare più attività semplici per la risoluzione di compiti complessi. <sequence> permette l'esecuzione in sequenza delle attività elencate <flow> permette l'esecuzione in parallelo delle attività elencate <switch> esecuzioni sottoposte a condizioni <while> gestione dei cicli <pick> permette di poter selezionare differenti path di esecuzione Java Web Services BPEL Variabili <variables> Permettono di trasformare i WS stateless in statefull. Memorizzano lo stato dei valori scambiati ra i vari WS coinvolti nel processo distribuito. Partner Links <partnerLinks> Rappresentano le entità con cui ogni componente del processo interagisce. Java Web Services BPEL : esempio <?xml version="1.0" encoding="utf-8"?> <process name="insuranceSelectionProcess" targetNamespace="http://packtpub.com/bpel/example/" xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:ins="http://packtpub.com/bpel/insurance/" xmlns:com="http://packtpub.com/bpel/company/" > <partnerLinks> <partnerLink name="client" partnerLinkType="com:selectionLT" myRole="insuranceSelectionService"/> <partnerLink name="insuranceA" partnerLinkType="ins:insuranceLT" myRole="insuranceRequester" partnerRole="insuranceService"/> <partnerLink name="insuranceB" partnerLinkType="ins:insuranceLT" myRole="insuranceRequester" partnerRole="insuranceService"/> </partnerLinks> ... Java Web Services BPEL : esempio ... <variables> <!-- input for BPEL process --> <variable name="InsuranceRequest" messageType="ins:InsuranceRequestMessage"/> <!-- output from insurance A --> <variable name="InsuranceAResposne" messageType="ins:InsuranceResponseMessage"/> <!-- output from insurance B --> <variable name="InsuranceBResposne" messageType="ins:InsuranceResponseMessage"/> <!-- output from BPEL process --> <variable name="InsuranceSelectionResponse" messageType="ins:InsuranceResponseMessage"/> </variables> ... Java Web Services BPEL : esempio <sequence> <!-- Receive the initial request from client --> <receive partnerLink="client" portType="com:InsuranceSelectionPT" operation="SelectInsurance" variable="InsuranceRequest" createInstance="yes" /> <!-- Make concurrent invocations to Insurance A and B --> <flow> <!-- Invoke Insurance A web service --> <invoke partnerLink="insuranceA" portType="ins:ComputeInsurancePremiumPT" operation="ComputeInsurancePremium" inputVariable="InsuranceRequest" outputVariable="InsuranceAResponse" /> <!-- Invoke Insurance B web service --> <invoke partnerLink="insuranceB" portType="ins:ComputeInsurancePremiumPT" operation="ComputeInsurancePremium" inputVariable="InsuranceRequest" outputVariable="InsuranceBResponse" /> </flow> Java Web Services BPEL : esempio <!-- Select the best offer and construct the response --> <switch> <case condition="bpws:getVariableData('InsuranceAResponse', 'confirmationData','/confirmationData/Amount') <= bpws:getVariableData('InsuranceBResposne', 'confirmationData','/confirmationData/Amount')"> <!-- Select Insurance A --> <assign> <copy> <from variable="InsuranceAResposne" /> <to variable="InsuranceSelectionResponse" /> </copy> </assign> </case> <otherwise> <!-- Select Insurance B --> <assign> <copy> <from variable="InsuranceBResposne" /> <to variable="InsuranceSelectionResponse" /> </copy> </assign> </otherwise> </switch> Java Web Services BPEL : esempio <process> sequence> ... <!-- Send a response to the client --> <reply partnerLink="client" portType="com:InsuranceSelectionPT" operation="SelectInsurance" variable="InsuranceSelectionResponse"/> </sequence> </process> Java Web Services BPEL BPEL Engine: z Oracle Process Manager z IBM Process Choreographer (BPELJ) z ActiveBPEL (Open Source) Java Web Services Librerie Java Web Services (J2EE) Copyright 1994-2007 Sun Microsystems, Inc. Java API for XML-RPC (JAX-RPC) è un’implementazione RMI-like per RPC over SOAP. SOAP with Attachments for Java (SAAJ ) permette la manipolazione a basso livello dei messaggi SOAP Java API for XML Messaging (JAXM ) fornisce alle applicazioni la possibilità di spedire/ricevere messaggi XML di tipo document oriented (basata su SAAJ) Java API for XML Registries (JAXR) fornisce i meccanismi di base per l’accesso e la gestione di registry XML based Java API for XML Processing (JAXP) fornisce gli strumenti necessari al parsing di documenti XML Contenute nel Java Web Services Developer Pack. Le API di AXIS 1.4 si basano su queste librerie Java Web Services Librerie Java Web Services (J5EE) Copyright 1994-2007 Sun Microsystems, Inc. Enterprise Web Services Direttive per il modello di programmazione e l'architettura a runtime per l'implementazione dei web services in Java. Java API for XML-Based Web Services (JAX-WS) Diventa la libreria di riferimento per l'implementazione dello stack per i Web services. Integrated stack: include JAX-WS 2.0, JAXB 2.0 e SAAJ 1.3. Permette di implementare tutte le funzionalità Java per la gestione dei WS all'interno del WSDP. JAX-WS prende il posto di JAX-RPC. Java Architecture for XML Binding (JAXB) viene utilizzata per effettuare il binding tra oggetti specificati negli XML schema e codice Java. Permette di incorporare dati XML in applicazioni Java senza che sia necessario conoscere il linguaggio XML. Streaming API for XML (StAX) permette di implementare parser per la gestione in lettura e scrittura di documenti XML Web Services Metadata for the Java Platform definisce “annotazioni” standard per la creazione di web services all'interno dei container Java EE. Utilizza Java Language Metadata . Java Web Services Java e Web Services - METRO Copyright 1994-2007 Sun Microsystems, Inc. Transition to GlassFish: The Java WSDP is being superseded by Project GlassFish and its open-source Java EE 5-compatible application server. You can gain access to all of the latest versions of the Java WSDP's technology components at Project GlassFish with the added benefit of community-based visual development. Technology acquired through Project GlassFish has the additional benefit of clearer, less restrictive licensing. Web services are Web based applications that use open, XML-based standards and transport protocols to exchange data with clients. Web services are developed using Java Technology APIs and tools provided by an integrated Web Services Stack called Metro. The Metro stack consisting of JAX-WS, JAXB, and WSIT, enable you to create and deploy secure, reliable, transactional, interoperable Web services and clients. The Metro stack is part of Project Metro and as part of GlassFish, Java Platform, Enterprise Edition (Java EE), and partially in Java PlatForm, Standard Edition (Java SE). GlassFish and Java EE also support the legacy JAX-RPC APIs. Java Web Services Librerie Java Web Services (METRO) Info from https://metro.dev.java.net/discover/ Copyright 1994-2007 Sun Microsystems, Inc. Core Web Services Include le tecnologie per l'invocazione e il deply dei Ws, per la gestione dei documenti XML e la gestione dei messaggistica SOAP -Java API for XML-Based Web Services (JAX-WS) -Java Architecture for XML Binding (JAXB) Enhanced Web Services Tecnologie WS- based per la gestione di caratteristiche speciali quali, ad esempio, consegna affidabile dei messaggi o gestione di transazioni (atomicità) - Web Services Interoperability Technologies (WSIT) Permette la cooperazione tre JavaWeb services e Microsoft's Windows Communication Foundation. Secure Web Services Tecnologie per la gestione della sicurezza nei WS. -XML and Web Services Security (XWS-Security) permette la definizione di politiche per l'affidabilità delle operazioni request/response Legacy Web Services Fornisce le tecnologie per l'utilizzo di vecchie librerie (Jax-rpc) Web Services - Management Permette di definire specifici profili per la comunicazione tra il sistema di gestione e le risorse gestite. Java Web Services JAX-WS: esempio servizio Info fromJ5EE Tutorial Copyright 1994-2007 Sun Microsystems, Inc. package helloservice.endpoint; import javax.jws.WebService; @WebService public class Hello { private String message = new String("Hello, "); public void Hello() {}//costruttore //metodo da espore @WebMethod public String sayHello(String name) { return message + name + "."; } } Nota: Per costruzione, la classe deve contenere la definizione di un costruttore pubblico senza argomenti Java Web Services JAX-WS: esempio client Info fromJ5EE Tutorial Copyright 1994-2007 Sun Microsystems, Inc. package simpleclient; import javax.xml.ws.WebServiceRef; import helloservice.endpoint.HelloService; import helloservice.endpoint.Hello; public class HelloClient { @WebServiceRef(wsdlLocation="http://localhost:8080/helloservice/hello?wsdl") static HelloService service; public static void main(String[] args) { try { HelloClient client = new HelloClient(); client.doTest(args); } catch(Exception e) { e.printStackTrace(); } } public void doTest(String[] args) { ... Hello port = service.getHelloPort(); ... String response = port.sayHello(name); ... } Apache AXIS v1.4 AXIS (Apache Extensible Interaction System) è un framework open souce per lo sviluppo e la gestione di Web Services in Java. Rappresenta l’estensione di Apache SOAP v2.0 . In pratica si tratta di un “SOAP engine”, ovvero un software in grado di gestire la codifica/decodifica dei messaggi SOAP facendo da tramite tra utente e Web Service. Supporta RPC & message/document based provider WSx User WSy AXIS WSz Java Web Services Apache AXIS: installazione Prerequisiti: J2SDK version>1.3 Apache ANT Xerces.jar – parser XML Servlet container (Tomcat) Installato Tomcat, basta copiare la directory $AXIS_HOME/webapps/axis nella directory $CATALINA_HOME/webapps/axis. E’ importante che tutti i file *.jar di $AXIS_HOME/lib stiano anche in $CATALINA_HOME/webapps/axis/lib. Impostare $AXISCLASSPATH in modo tale che contenga tutte le librerie necessarie ad AXIS ($AXIS_HOME/lib , Xerces.jar, mail.jar, activation.jar) Java Web Services Apache AXIS: installazione All’indirizzo localhost:8080/axis cliccare sul link valitation La pagine associata verifica che siano soddisfatte tutte le richieste. La condizione è necessaria ma non sufficiente Java Web Services Apache AXIS: architettura Ogni messaggio viene elaborato passando attraverso una serie di handler (chain-catene di handler). Ogni handler esegue uno specifico compito. Quali e quanti handler vengono utilizzati dipende dal tipo di servizio utilizzato (server-config.wsdd). Java Web Services Apache AXIS: architettura MessageContext object: rappresenta il messaggio (in-out) Handler: transport handler dipendono dal protocollo di trasporto utilizzato global handler processano ogni tipo di messaggio service-specific handler processano solo messaggi diretti ad uno specifico ws Pivot-point: handler di passaggio tra percorso in e percorso out Java Web Services Apache AXIS: architettura Message Context Pivot Point Specific WS Java Web Services Apache AXIS: architettura Server path Client path Java Web Services Apache AXIS: server/client path AXIS server: z il messaggio SOAP viene inserito dal TrasportListener all’interno di un messaggio Message z l’oggetto Message, insieme a informazioni come il protocollo di trasporto e il parametro SoapAction, viene inserito all’interno di un MessageContext. z Il MessageContext passa attraverso gli handler (chain) transport e global, arrivando al target service-specific handler che si occupa di passarlo al provider. z Il provider (pivot point), anch’esso handler, si occupa di mandare in esecuzione il WSn esecuzione il WS AXIS client: percorso speculare a logica invertita. Java Web Services Apache AXIS: deploy dei servizi Axis mette a disposizione due tecniche per il deploy dei servizi: JWS deploy technique utilizzata per la gestione di WS semplici, molto veloce ma poco flessibile (drop-in) WSDD deploy technique utilizzata per la gestione di WS complessi, estremamente flessibile e personalizzabile, legata a file di configurazione Java Web Services Apache AXIS: JWS deploy Creazione del file applicazione.java Modifica dell’estensione del file in applicazione.jws Copia del file applicazione.jws nella cartella $AXISWEB/webapps/axis/ Axis si occupa della compilazione dell’applicazione, del mapping parametri Java/XML, del deploy del servizio e della creazione del file wsdl ( localhost:8080/axis/applicazione.jws?WSDL) Il costo intellettuale è praticamente nullo. Con questa soluzione vengono esposti tutti i metodi pubblici e non statici: per avere più controllo sui metodi ed imporre il passaggio da specifici handler è necessario il WSDD deploy. Java Web Services Apache AXIS: WSDD deploy Web Services Deployment Description (WSDD) Permette di definire il mapping dei tipi Java/XML Permette di definire quali metodi rendere accessibili Permette di definire lo scope del WS invocato Permette di associare specifici handler al servizio Permette il deploy del servizio in assenza del codice sorgente Java Web Services Apache AXIS: WSDD deploy <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/providers/java"> <handler name=hnd1 type=“URIclasseh1”> <handler name=hnd2 type=“URIclasseh2”> <handler name=hndn type=“URIclassehn”> <service name= “nomeclass” provider= “java:RPC”> <parameter name=“allowedMethod” value=“met_1”/> <parameter name=“scope” value=“application”/> <requestFlow> <handler type=“URIclasseh1”/> </requestFlow> <responseFlow> <handler type=“URIclasseh1”/> </requesteFlow> </service> </deployment> Java Web Services Apache AXIS: WSDD deploy <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/providers/java"> <handler name=hnd1 type=“URIclasseh1”> <handler name=hnd2 type=“URIclasseh2”> <handler name=hndn type=“URIclassehn”> <service name= “nomeclass” provider= “java:RPC”> <parameter name=“allowedMethod” value=“met_1> <parameter name=“scope” value=“application”/> <requestFlow> <handler type=“URIclasseh1”/> </requestFlow> <responseFlow> <handler type=“URIclasseh1”/> </requesteFlow> </service> </deployment> Java Web Services Apache AXIS: WSDD deploy <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/providers/java"> <handler name=hnd1 type=“URIclasseh1”> <handler name=hnd2 type=“URIclasseh2”> <handler name=hndn type=“URIclassehn”> <service name= “nomeclass” provider= “java:RPC”> <parameter name=“allowedMethod” value=“met_1> <parameter name=“scope” value=“request”/> <requestFlow> <handler type=“URIclasseh1”/> </requestFlow> <responseFlow> <handler type=“URIclasseh1”/> </requesteFlow> </service> </deployment> Application 1obj:all req Session 1obj: client Java Web Services Apache AXIS: WSDD deploy <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/providers/java"> <handler name=hnd1 type=“URIclasseh1”> <handler name=hnd2 type=“URIclasseh2”> <handler name=hndn type=“URIclassehn”> <service name= “nomeclass” provider= “java:RPC”> <parameter name=“allowedMethod” value=“met_1> <parameter name=“scope” value=“application”/> <requestFlow> <handler type=“URIclasseh1”/> </requestFlow> <responseFlow> <handler type=“URIclasseh2”/> </requesteFlow> </service> </deployment> Java Web Services Apache AXIS: invocazione dei servizi AXIS mette a disposizione dell’utente tre diverse metodologie di invocazione: Stub based Genera lo stub a buid time dal WSDL tramite l’utility WSDL2java Dynamic Invocation Interface (DII) Invocazione del servizio tramite stub generato a run time Dynamic Proxy Java Web Services Apache AXIS: invocazione Stub based public class Prova {public int MetodoXY-Z(int X, int Y){return Z=f(X;Y);}} java org.apache.axis.wsdl.WSDL2Java URL/axis/Prova.jws?wsdl Per ogni elemento in <types> genera una classe Java <portType> genera una interfaccia java <binding> genera uno stub <service> genera l’interfaccia generica del servizio Prova.java E’ la Services Definition Interface, interfaccia ottenuta da <portType> che estende java.rmi.Remote. ProvaService.java Interfaccia ottenuta da <service> ProvaServiceLocator.java La classe locator, contenente l'interfaccia di servizio, tramite cui si ottenere un'istanza dello stub. ProvaSoapBindingStub.java E’ la classe che contiene il codice “ accessibile dalle API di Axis, nascondendo l’implementazione di SOAP. Java Web Services Apache AXIS: invocazione Stub based Tutti i file generati vengono inseriti all’interno di un package. import localhost.axis.prova; public class ProvaClient { public static void main (String args[]) throws Exception { int X=arg[1]; int Y=arg[2]; // Creazione del servizio ProvaService service = new ProvaServiceLocator(); // Stub Prova prv = service.getProva(); // Invocazione int z= = prv.MetodoXY-Z(X,Y); System.out.println(“Z=“+z); } } Java Web Services Apache AXIS: Dynamic Invocation Interface import org.apache.axis.client.*; import javax.xml.*; import java.net.URL; public class ServiceClient { public static void main(String[] args) throws Exception { String endpoint = "http://127.0.0.1:8080/axis/serviceclass.jws"; URL servurl = new URL(endpoint); Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(servurl)); call.setOperationName(“metodoXY-Z"); call.addParameter(“X", XMLType.XSD_INT, ParameterMode.IN); call.addParameter(“Y", XMLType.XSD_INT, ParameterMode.IN); call.setReturnType(XMLType.XSD_INT); int Z = call.invoke(newObject[]{arg[1],arg[2]}); System.out.println("Ris:" + Z); } } Java Web Services Apache AXIS: Dynamic Invocation Interface import org.apache.axis.client.*; import javax.xml.*; import java.net.URL; public class ServiceClient { public static void main(String[] args) throws Exception { String endpoint = "http://127.0.0.1:8080/axis/serviceclass.jws"; URL servurl = new URL(endpoint); Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(servurl)); call.setOperationName(“metodoXY-Z"); call.addParameter(“X", XMLType.XSD_INT, ParameterMode.IN); call.addParameter(“Y", XMLType.XSD_INT, ParameterMode.IN); call.setReturnType(XMLType.XSD_INT); int Z = call.invoke(newObject[]{arg[1],arg[2]}); System.out.println("Ris:" + Z); } } Java Web Services Apache AXIS: Dynamic Invocation Interface import org.apache.axis.client.*; import javax.xml.*; import java.net.URL; public class ServiceClient { public static void main(String[] args) throws Exception { String endpoint = "http://127.0.0.1:8080/axis/serviceclass.jws"; URL servurl = new URL(endpoint); Service service = new Service(); Call call = (Call)service.createCall(); call.setTargetEndpointAddress(servurl)); call.setOperationName(“metodoXY-Z"); call.addParameter(“X", XMLType.XSD_INT, ParameterMode.IN); call.addParameter(“Y", XMLType.XSD_INT, ParameterMode.IN); call.setReturnType(XMLType.XSD_INT); int Z = call.invoke(newObject[]{arg[1],arg[2]}); System.out.println("Ris:" + Z); } } Java Web Services Apache AXIS: Dynamic Invocation Interface import org.apache.axis.client.*; import javax.xml.*; import java.net.URL; public class ServiceClient { public static void main(String[] args) throws Exception { String endpoint = "http://127.0.0.1:8080/axis/serviceclass.jws"; URL servurl = new URL(endpoint); Service service = new Service(); Call call = (Call)service.createCall(); call.setTargetEndpointAddress(servurl)); call.setOperationName(“metodoXY-Z"); call.addParameter(“X", XMLType.XSD_INT, ParameterMode.IN); call.addParameter(“Y", XMLType.XSD_INT, ParameterMode.IN); call.setReturnType(XMLType.XSD_INT); int Z = call.invoke(newObject[]{arg[1],arg[2]}); System.out.println("Ris:" + Z); } } Java Web Services Apache AXIS: Dynamic Stub import javax.xml.namespace.QName; import javax.xml.rpc.*; public class ServiceClient { public static void main(String [] args) throws Exception { String wsdlUrl = "http://127.0.0.1:8080/axis/serviceclass.jws?wsdl"; String nsUri = "http://127.0.0.1:8080/axis/serviceclass.jws"; String serviceName = "Service"; String portName = “metodoXY-Z"; int X=arg[1]; int Y=arg[2]; ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service srv = serviceFactory.createService(\ newjava.net.URL(wsdlUrl),\ new QName(nameSpaceUri, serviceName)); ServServiceIntf servInt = (ServServiceIntf)srv.getPort( new QName(nameSpaceUri, portName), ServServiceIntf.class); System.out.println(“Ris:" + srvInt.metodoXY-Z(3,3)); } } Java Web Services Apache AXIS: Dynamic Stub import javax.xml.namespace.QName; import javax.xml.rpc.*; public class ServiceClient { public static void main(String [] args) throws Exception { String wsdlUrl = "http://127.0.0.1:8080/axis/serviceclass.jws?wsdl"; String nsUri = "http://127.0.0.1:8080/axis/serviceclass.jws"; String serviceName = "Service"; String portName = “metodoXY-Z"; int X=arg[1]; int Y=arg[2]; ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service srv = serviceFactory.createService(\ newjava.net.URL(wsdlUrl),\ new QName(nameSpaceUri, serviceName)); ServServiceIntf servInt = (ServServiceIntf)srv.getPort( new QName(nameSpaceUri, portName), ServServiceIntf.class); System.out.println(“Ris:" + srvInt.metodoXY-Z(3,3)); } } Java Web Services Apache AXIS: Dynamic Stub import javax.xml.namespace.QName; import javax.xml.rpc.*; public class ServiceClient { public static void main(String [] args) throws Exception { String wsdlUrl = "http://127.0.0.1:8080/axis/serviceclass.jws?wsdl"; String nsUri = "http://127.0.0.1:8080/axis/serviceclass.jws"; String serviceName = "Service"; String portName = “metodoXY-Z"; int X=arg[1]; int Y=arg[2]; ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service srv = serviceFactory.createService(\ newjava.net.URL(wsdlUrl),\ new QName(nameSpaceUri, serviceName)); ServServiceIntf servInt = (ServServiceIntf)srv.getPort( new QName(nameSpaceUri, portName), ServServiceIntf.class); System.out.println(“Ris:" + srvInt.metodoXY-Z(3,3)); } } Java Web Services Apache AXIS: Dynamic Stub import javax.xml.namespace.QName; import javax.xml.rpc.*; public class ServiceClient { public static void main(String [] args) throws Exception { String wsdlUrl = "http://127.0.0.1:8080/axis/serviceclass.jws?wsdl"; String nsUri = "http://127.0.0.1:8080/axis/serviceclass.jws"; String serviceName = "Service"; String portName = “metodoXY-Z"; int X=arg[1]; int Y=arg[2]; ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service srv = serviceFactory.createService(\ newjava.net.URL(wsdlUrl),\ new QName(nameSpaceUri, serviceName)); ServServiceIntf servInt = (ServServiceIntf)srv.getPort( new QName(nameSpaceUri, portName), ServServiceIntf.class); System.out.println(“Ris:" + srvInt.metodoXY-Z(3,3)); } } Java Web Services Apache AXIS: Dynamic Stub import javax.xml.namespace.QName; import javax.xml.rpc.*; public class ServiceClient { public static void main(String [] args) throws Exception { String wsdlUrl = "http://127.0.0.1:8080/axis/serviceclass.jws?wsdl"; String nsUri = "http://127.0.0.1:8080/axis/serviceclass.jws"; String serviceName = "Service"; String portName = “metodoXY-Z"; int X=arg[1]; int Y=arg[2]; ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service srv = serviceFactory.createService(\ newjava.net.URL(wsdlUrl),\ new QName(nameSpaceUri, serviceName)); ServServiceIntf servInt = (ServServiceIntf)srv.getPort( new QName(nameSpaceUri, portName), ServServiceIntf.class); System.out.println(“Ris:" + srvInt.metodoXY-Z(3,3)); } } Java Web Services Riferimenti Manuali: Understanding SOA with WebServices, Java Web Services, Building Web Services with Java, Art of Java Web development, The Java Web Services Tutorial, Addison Wesley O’really Sams Manning S.U.N. Web: WS: www.w3.org/2002/ws/ XML:XML tutorial – W3School SOAP: www.w3.org/TR/2003/REC-soap12-part0-20030624/ WSDL: www.w3.org/TR/wsdl BPEL: Business processes in a Web services world IBM AXIS: ws.apache.org/axis - architecture and user guides - Java Web Services Facoltà di Ingegneria - Università degli studi di Catania Dipartimento di Ingegneria Informatica e delle Telecomunicazioni Java Web Services Giovanni Morana Facoltà di Ingegneria - Università degli studi di Catania Dipartimento di Ingegneria Informatica e delle Telecomunicazioni Domande? Java Web Services Giovanni Morana