Corso di Web Services A A. 2010 2011 Domenico Rosaci SOAP SOAP Introduzione • I WS si basano sull’uso di diverse tecnologie sottostanti • Le tecnologie a cui siamo interessati in questo contesto sono: – – – – SOAP WSDL WS IL UDDI SOAP 2 Cos’è un Web Service? • Un WS è un’interfaccia accessibile in rete per funzionalità applicative, costruita utilizzando tecnologie Internet standard • In altre parole, se un’applicazione è tale che si può accedere ad essa tramite una combinazione di protocolli Internet standard come HTTP, XML, SMTP, allora quell’applicazione è un Web Service • Quindi si tratta di un concetto semplice, e per nulla nuovo. Piuttosto, esso sintetizza dei concetti già esistenti da anni relativamente al Web. SOAP 3 Cos’è un WS SOAP 4 Fondamenti di WS • Un WS è quindi un’interfaccia posizionata tra il codice dell’applicazione e l’utente dell’applicazione • Agisce come un “livello di astrazione”, separando i dettagli relativi alla piattaforma e al linguaggio di programmazione dal modo in cui il codice dell’applicazione è effettivamente invocato • Questa astrazione consente ad ogni linguaggio che supporta i WS di accedere alle funzionalità dell’applicazione SOAP 5 Fondamenti di WS SOAP 6 Fondamenti di WS • I WS che vediamo attualmente distribuiti (deployed) sul Web sono siti Web HTML. • In questi siti i servizi applicativi, cioè i meccanismi per pubblicare, gestire, cercare contenuti sono acceduti attraverso protocolli e formati standard: HTTP e HTML • Le applicazioni Client (i Web browser) possono interagire con i servizi applicativi per portare avanti task come ad esempio cercare in un catalogo di libri, procedere ad un acquisto, ecc SOAP 7 Fondamenti di WS • Grazie al livello di astrazione dei WS, non importa quale linguaggio sia stato usato per scrivere i servizi applicativi, e se questo linguaggio è differente da quello in cui è scritto il Browser • Anche l’eventuale eterogeneità dei Sistemi Operativi sottostanti alle applicazioni interagenti è irrilevante • I WS permettono così un’interoperabilità “cross platform” SOAP 8 Fondamenti di WS • C’è attualmente uno sforzo notevole nella comunità Java per definire un’esatta architettura per implementare i WS nel framework di Java 2 EE • Tutti le principali aziende sviluppatrici (IBM, Sun, etc) lavorano continuamente per permettere il supporto dei WS nelle loro piattaforme • IBM per esempio ha integrato i WS nelle sue piattaforme WebSphere, Tivoli, Lotus e DB”, mentre Microsoft ha fatto lo stesso con la piattaforma .NET SOAP 9 Aspetto dei WS • I WS sono un framework per il supporto dei messaggi • La forma più comune di WS è quella di chiamare procedure in esecuzione su un server, tramite messaggi del tipo “chiama questa procedura con questi argomenti” oppure “questo è il risultato della chiamata della procedura” • Il codice dell’applicazione contiene dtutta la logica di business e codifica i task (aggiungere un libro a un catalogo, cercare un libro, ecc.). • Il Service Listener è in grado di comprendere i protocolli (HTTP, SOAP, Jabber, etc.) e sta in ascolto dei messaggi di richiesta • Il Service Proxy può elaborare una risposta per il Service Listener (ma può anche non esserci) SOAP 10 Aspetto dei WS SOAP 11 Aspetto dei WS • Le componenti Service Proxy e Service Listener possono essere componenti stand alone (un HTTP o TCP server ad esempio) o possono essere eseguite nel contesto di altri tipi di application server. • Ad esempio, WebShere Application Server include librerie built in per ricevere messaggi SOAP su HTTP ed usarli per invocare applicazioni Java distribuite in WebSphere. Anche Apache Web Server ha un modulo che implementa SOAP. • La necessità di un Application Server non è fondamentale. I WS possono essere implementati su qualunque sistema che supporti le tecnologie Internet standard, anche su un palmtop o su un cellulare. SOAP 12 Aspetto dei WS • I WS non richiedono il tradizionale modello Client Server per le applicazioni, né richiedono un modello architetturale n tier. • Possono essere implementati in qualunque contesto, anche distribuito, a patto che siano presenti i protocolli Internet standard. SOAP 13 Intersezione di Business e Programmazione • I programmatori tendono a porsi questioni del tipo “come posso eseguire questo task più velocemente?” oppure “Come posso sfruttare l’ereditarietà tra gli oggetti?” • Coloro che si preoccupano del business si pongono invece delle domande del tipo “Come posso assicurarmi che chi usa questo servizio sia realmente chi dice di essere?” oppure “Come posso mettere insieme più WS in un workflow?” • A volte i 2 punti di vista entrano in conflitto. Il Business richiede efficacia, sicurezza, affidabilità, mentre la programmazione ha come obiettivo l’efficienza, la semplicità e la robustezzza. SOAP 14 Business vs Programmazione • Difficilmente i tool WS riescono a conciliare entrambi gli aspetti • Ad esempio, SOAP::Lite è un ambiente di implementazione SOAP basato su Perl, scritto essenzialmente per programmatori. Fornisce un insieme di tool per invocare moduli Perl attraverso messaggi SOAP • Invece Apache Axis è un ambiente di sviluppo SOAP che consente di implementare soluzioni più complesse, realizzando processi o tenendo insieme più WS • La cosa importante da sottolineare è che qualunque approccio WS si basa sulle stesse tecnologie Web (WSDL, UDDI, ecc.). La differenza sta nelle possibilità che il singolo approccio offre al programmatore per interfacciarsi con l’applicazione. SOAP 15 Integrazione Just-in-Time • L’integrazione JIT consente di innestare il modello di distribuzione delle applicazioni Internet sul modello chiamato “Architettura WS” SOAP 16 Integrazione JIT • Il service provider pubblica una descrizione dei servizi che offre attraverso il service registry • Il service consumer cerca nel service registry i servizi che soddisfano le sue necessità • Il consumer può essere una persona o un programma • Il binding fa riferimento a un consumer che sta realmente utilizzando un servizio offerto da un provider • La chiave per l’integrazione JIT è che essa può avvenire in qualunque momento, anche a runtime, come nell’early binding della OOP • Il client potrebbe cioè non conoscere quali procedure chiamerà fino a quando non viene eseguita la ricerca del servizio e si trova il candidato adatto SOAP 17 WS Technology Stack • L’architettura WS è implementata attraverso l’utilizzo di cinque tipi di tecnologie, organizzate in layer disposti su uno stack SOAP 18 WS Technology Stack • La struttura presenta un’evidente similitudine con lo stack dei protocolli TCP-IP SOAP 19 WS Technology Stack • I layer addizionali packaging, description e discovery sono essenziali per fornire l’integrazione JIT • Ogni layer ha a che fare con un determinato business problem, quindi non è necessario implementarli tutti. Quando un nuovo layer va aggiunto, non è necessario riscrivere il codice esistente • L’ambiente distribuito che ne risulta è completamente modulare, diversamente dalle vecchie soluzioni Java o Corba per ambienti distribuiti SOAP 20 Oltre lo Stack • I layer dello stack WS non ricoprono tutte le problematiche possibili. Per esempio, non danno soluzione ai problemi di sicurezza, privacy, trust, workflow e molti altri • Intervengono quindi altri standard quali: – – – – – – – – – XML (alternativa a SOAP) XKMS (sicurezza) SAML (sicurezza) XML Dsig (firma digitale) XML Enc (crypting) XSD (ontologie) P3P (privacy) WSFL (workflow) Jabber (Peer to peer) SOAP 21 Layer 1: Discovery • Il layer Discobery fornisce i meccanismi che permettono al client di scoprire le descrizioni dei servizi dei provider • Uno degli standard più largamente diffusi in questo contesto è l’Universal Description Discovery and Integration (UDDI) • IBM e Microsoft hanno congiuntamente proposto un’alternativa ad UDDI, che è il Web Services Inspection Language (WS Inspection) SOAP 22 Layer 2: Description • Quando un WS è implementato, occorre prendere delle decisioni su come supporterà i protocolli di network, transport e packaging • Una descrizione del servizio rappresenta queste decisioni • Il Web Service Description Language (WSDL) è lo standard de facto in questo contesto • RDF e DARPA sono altre alternative proposte dal W3C, èiù ricche ma molto più complesse di WSDL • SOAP 23 Layer 3: Packaging • Affinchè i dati delle applicazioni possona muoversi attraverso la rete mediante il livello di trasporto, essi devono essere “impacchettati” in un formato comprensibile da ognuno degli attori coinvolti • HTML potrebbe essere un formato candidabile, ma esso è troppo strettamente legato alla presentazione delle informazioni, piuttosto che alla rappresentazione del contenuto informativo • XML invece permette di rappresentare la struttura delle informazioni • SOAP è un formato di packaging molto comune, costruito su XML SOAP 24 Layer 4: Transport • Il livello di trasporto include le varie tecnologie che permettono la comunicazione application-to-application • Alcuni protocolli utilizzati sono TCP, HTTP, SMTP e Jabber • Il ruolo primario del livello di trasporto è quello di muovere dati tra due o più locazioni della rete • I WS possono essere costruiti sopra qualunque protocollo di trasporto • La scelta del protocollo di trasporto da utilizzare dipende dalle esigenze specifiche. HTTP ad esempio include il servizio firewall più ubiquo, ma non supporta la comunicazione asincrona. Jabber invece, pur non essendo un vero standard, rappresenta una buona soluzione per instaurare canali di comunicazione asincrona. SOAP 25 Layer 5: Network • Il livello Network è lo stesso che nel modello TCP/IP • Fornisce le principali funzionalità per l’addressing ed il routing su rete SOAP 26 Le applicazioni • Le funzionalità del WS sono implementate attraverso un codice, che rappresenta un generico “livello delle applicazioni” che si serve dei vari layer dello stack sottostanti SOAP 27 Modello Peer Services • Rappresenta una visione alternativa dei WS • Basato sull’architettura P2P, prevede che un insieme di membri condividano una collezione di servizi • Esistono evidenti similitudini tra il modello P2P e i WS • La principale differenza è che nei sistemi P2P il ruolo di consumer e provider è molto interscambiabile, mentre nei WS la differenza è solitamente netta • Instant Messaging è un esempio molto nodo di modello WS P2P. SOAP 28 SOAP: Concetti di base • E’ un protocollo standard di packaging per i messaggi che si scambiano le applicazioni • La specifica definisce niente più che una semplice busta absata su XML per le informazioni che vengono trasferite, ed un insieme di regole per la traduzione dei tipi di dati delle applicazioni in rappresentazioni XML • SOAP è un’applicazione delle specifiche XML • Si rifà fortemente agli standard XML come XML Schema e XML Namespace • SOAP 29 XML Messaging • Un messaggio può essere qualunque cosa: un ordinativo d’acquisto, una prenotazione di un volo, una richiesta di ricerca in un catalogo e così via • Essendo XML indipendente da qualunque piattaforma o linguaggio di programmazione, esso può consentire di fare comunicare applicazioni che girano su sistemi operativi diversi, basandosi su linguaggi diversi SOAP 30 RPC e EDI • SOAP ha due applicazioni possibili: RPC e EDI • Remote Procedure Call (RPC) è un meccanismo che permette a metodi che girano su macchine diverse di “chiamarsi” a vicenda scambiandosi dei parametri • Electronic Document Interchange (EDI) definisce un formato standard per documenti e messaggi finanziari e commerciali • Si può usare un “document style” SOAP basato su EDI, con XML che rappresenterà ordini, tabelle fiscali e documenti simili. Oppure usare un “RPC style” SOAP basato su RPC dove XML rappresenterà argomenti per metodi o valori di ritorno SOAP 31 Necessità di una codifica standard • Un’informazione, come ad es. un numero di telefono, si può rappresentare in diversi modi SOAP 32 Codifica standard • Oltre a dire che stiamo usando XML, dobbiamo definire: – Il tipo di informazione che stiamo scambiando – Come l’informazione viene espressa in XML – Come inviare realmente l’informazione Senza tali informazioni, le applicazioni non saprebbero decodificare i messaggi, anche sapendo che essi sono codificati in XML. SOAP fornisce questo tipo di informazioni SOAP 33 Messaggi SOAP • Un messaggio SOAP consiste di una busta contenete un header (opzionale) e un body /richiesto) • L’header contiene blocchi di informazione che indicano come il messaggio deve essere processato (settaggi sul routing e sulla delivery, asserzioni di autenticazione e autorizzazione, e contesti di transazione) • Il body contiene il messaggio vero e proprio. Qualunque cosa possa essere espressa in XML può andare nel body di un messaggio. SOAP 34 Messaggi SOAP SOAP 35 Messaggi SOAP • La sintassi XML per rappresentare un messaggio SOAP message è basata sul namespace http://www.w3.org/2001/06/soap-envelope namespace. SOAP 36 Esempio di document style SOAP SOAP 37 Esempio SOAP • Nell’esempio si fa uso dei “namespace” per definire gli spazi dei nomi principali “soap-envelop” (s), “soap-transaction” (m) e “orderService” (n). • Ogni messaggio possiede l’elemento “contenitore” s:enevelope, l’elemento opzionale s:Header e l’elemento obbligatorio “s:Body” SOAP 38 Sintassi SOAP • Ogni envelope può contenere esattamente un elemento Body • Il contenuto dell’elemento Body, che può essere composto da un qualunque numero di sottoelementi, rappresenta il messaggio vero e proprio • Ogni envelope può contenere al massimo un Header, che se esiste deve apparire come il primo “figlio” di envelope • Il proposito di un header è quello di comunicare informazioni contestuali utili per processare un messaggio (ad esempio, credenziali di autenticazione). SOAP 39 Messaggi RPC Style • Solitamente viaggiano in coppia: un messaggio di richiesta ed un messaggio di risposta • Si immagini, come esempio, che il server offra la seguente funzione che ritorna il valore azionario di un’azienda: • Public float getQuote(String symbol); SOAP 40 Esempio di richiesta SOAP 41 Esempio di risposta SOAP 42 L’attributo mustUnderstand • Questo attributo appare nell’header del messaggio. Se è settato uguale a “true”, esso impone al ricevente del messaggio di “comprendere” il contenuto dell’header oltre che del body • Se il contenuto dell’header non è stato compreso, e mustUnderstand=“true”, il ricevente deve rifiutare il messaggio anche nel caso riuscisse a comprendere il Body SOAP 43 Encoding style • Un encoding style è un insieme di regole che specificano come i tipi di dato sono codificati attraverso la sintassi XML • A tale scopo si usa l’attributo encodingStyle SOAP 44 Distinguere tra le versioni SOAP • La versione di un messaggio SOAP può essere determinata verificando il namespace. • Ad esempio, la versione 1.1. usa il namespace http://www.w3.org/2001/06/soap-envelope, mentre la 1.2 usa il namespace http://www.w3.org/2001/06/soap-envelope. • Se l’applicazione ricevente determina una versione SOAP non supportata nel messaggio del ricevente, può comunicare al ricevente qual è la versione supportata inserendo nell’header l’attributo upgrade SOAP 45 Esempi di errori SOAP SOAP 46 Errori SOAP SOAP 47 Errori standard SOAP 48 “Custom” Faults SOAP 49 L’attributo Misunderstood SOAP 50 Il modello SOAP per lo scambio di messaggi • Processare un messaggio SOAP significa esaminare la busta e poi effettuare delle operazioni. I dettagli tecnici su come le operazioni sono implementate sono demandati alle applicazioni • Il “core” del modello sta nel fatto che mentre un messaggio SOAP è una trasmissione one way da un sender a un receiver, l’envelope può passare attraverso vari processori • “intermediari”, e l’output di un intermediario diventa l’input del successivo (pipeline) • Un intermediario è un WS disegnato per stare tra il sender e il receiver e aggiungere funzionalità alle transazioni tra i due. • Ogni intermediario è chiamato attore e l’insieme degli intermediari è chiamato message path SOAP 51 Message Path • La costruzione del message path non è coperta da SOAP. Esistono altri protocolli, come WS-Routing, anche se nessuno di essi è uno standard de facto • SOAP può invece specificare quali parti dell’header devono essere processate da uno specifico attore (targeting). Il targeting non può essere applicato al body • Per etichettare un actor, si usa l’attributo actor e si fa riferimento all’URL dell’actor • Per esempio, un venditore di libri può ricevere messaggi SOAP dai suoi clienti, e stabilire che ogni messaggio prima passi da un “third party” WS che ne estrae la firma digitale e la verifica, e poi aggiunge un blocco all’header per informare il venditore dell’esito della verifica SOAP 52 Messaggi SOAP: esempio SOAP 53 Esempio di Messaggio SOAP 54 SOAP Routing Protocol • WS Routing (Microsoft) definisce un header SOAP standard per specificare il message path SOAP 55 Messaggi RPC Style • Regole per invocare una procedura RPC attraverso SOAP: – Il metodo call si rappresenta attraverso una struttura dati in cui ogni compo modella un parametro di ingresso e di uscita – I nomi e l’ordine dei campi devono corrispondere ai nomi e all’ordine dei parametri del metodo • • • • • Esempio: String checkStatus(String orderCode, String customerID); Può essere invocata con questi argomenti: result = checkStatus("abc123", "Bob's Store") Mediante la seguente busta SOAP SOAP 56 Invocare un metodo SOAP 57 Ritornare una risposta SOAP 58 Codifica dei dati SOAP • • • • • • • • Un “valore” rappresenta un dato o una combinazione di dati Un “accessor” rappresenta una variabile <name> <firstname> Joe </firstname> <lastname> Smith </lastname> </name> Joe è un valore, firstname è un accessor name è un “compound accessor” perché è un elemento che ha due “figli” • Ci sono due tipi di compound accessor, le structs e gli array SOAP 59 Struct e array • • • • • • • • • • <!--A struct --> <person> <firstname>Joe</firstname> <lastname>Smith</lastname> </person> <!--An array--> <people> <person name='joe smith'/> <person name='john doe'/> </people> SOAP 60 Single-Referenced Accessor • • • • • • • • • <people> <person name='joe smith'> <address> <street>111 First Street</street> <city>New York</city> <state>New York</state> </address> </person> </people> SOAP 61 Multi-Referenced Accessor • • • • • • • • • • • • • <people> <person name='joe smith'> <address href='#address-1' </person> <person name='john doe'> <address href='#address-1' </person> </people> <address id='address-1'> <street>111 First Street</street> <city>New York</city> <state>New York</state> </address> SOAP 62 Accesso a dati esterni • <person name='joe smith'> • <address href='http://acme.com/data.xml#joe_smith' /> • </person> SOAP 63 Definire tipi di dati SOAP • 1. Usare l’ xsi:type attribute su ogni accessor in accordo alla XML Schema specification: • 2. <person> • 3. <name xsi:type="xsd:string">John Doe</name> • </person> • 4. Referenziare un XML Schema document che definisce il tipo dell’elemento: • 5. <person xmlns="personschema.xsd"> • 6. <name>John Doe</name> • 7. </person> • 8. <!-- dove "personschema.xsd" definisce l’elemento name • Come tipo=xsd:string --> SOAP 64 Definire tipi di dato (continua) • 9. Referenziare altri tipi di schema document che definiscono il tipo di dato di un particolare elemento con la loro propria definizione: • 10. <person xmlns="urn:some_namespace"> • 11. <name>John Doe</name> • 12. </person> • 13. <dove "urn:some_namespace" indica un namespace in cui il valore degli elementi nome è una stringa--> SOAP 65 Tipi di dato SOAP • I tipi di dato supportati sono quelli definite dalle specifiche XML Schema • Si prevedono due sintassi alternative per i valori dei tipi • <SOAP-ENC:int>36</SOAP-ENC:int> • <value xsi:type="xsd:int">36</value> • Il primo metodo è conosciuto come “anonymous accessor” (non è specificato il nome dell’elemento), mentre il secondo metodo è conosciuto come “named accessor” (il nome dell’accessor nell’esempio è value) SOAP 66 Referenze multiple nei dati • I dati multiple referenced possono essere usati per indicare che due variabili condividono lo stesso spazio di memoria. Esempio: • <value xsi:type="xsd:int" id="v1">42</value> • <value href="#v1" /> • In questo esempio, la seconda variabile (che non ha un nome, perché manca l’id) “referenzia la prima variabile (il cui nome è v1) SOAP 67 Array • L’array più semplice è l’array di byte, che usa il tipo standard base 64 • <some_binary_data xsi:type="SOAP-ENC:base64"> • aDF4JIK34KJjk3443kjlkj43SDF43== • </some_binary_data> • Gli array regolari sono indicati come appartenenti al tipo SOAP-ENC:Array o a un suo derivato • Il tipo dabse dell’array è indicato attraverso l’attributo arrayType SOAP 68 Esempio di array monodimensionale • <some_array xsi:type="SOAP-ENC:Array" SOAPENC:arrayType="se:string[3]"> • <se:string>Joe</se:string> • <se:string>John</se:string> • <se:string>Marsha</se:string> • </some_array> • Nelle parentesi quadre è indicata la cardinalità dell’array. Se l’array fosse multidimensionale, avremmo più coppie di parentesi quadre SOAP 69 Array bidimensionale SOAP 70 Array parzialmente trasmessi • Se abbiamo un array di 5 elementi e vogliamo trasmettere solo gli ultimi 2, scriveremo: • <names xsi:type="SOAP-ENC:Array" SOAPENC:arrayType="xsd:string[5]" • SOAP-ENC:offset="[2]"> • <name>Item 4</name> • <name>Item 5</name> • </names> • Dove l’attributo offset specifica da quale indice dell’array iniziamo a trasmettere (il primo indice è 0) SOAP 71 Array sparso • E’ un array che contiene solo alcuni elementi tra quelli possibili. Ad esempio, se abbiamo un array 10x10 e vogliamo affermare che solo gli elementi [2,5] e [5,2] contengono dati, scriveremo: • <names xsi:type="SOAP-ENC:Array" SOAPENC:arrayType="xsd:string[10,10]"> • <name SOAP-ENC:position="[2,5]">data</name> • <name SOAP-ENC:position="[5,2]">data</name> • </names> SOAP 72 Accessor Null • <name xsi:type="xsd:string" xsi:nil="true" /> SOAP 73 SOAP Transport • SOAP è un protocollo di packaging e funziona con qualunque protocollo di trasporto sottostante • HTTP è il protocollo di trasporto più comune • Essendo HHTP un protocollo request-response-based, esso rappresenta un modo naturale per esprimere richieste RPC (attraverso la richiesta HTTP al server) e fornire le risposte (attraverso la risposta HTTP) SOAP 74 Esempi di SOAP over HTTP • • • • • POST /StockQuote HTTP/1.1 Content-Type: text/xml Content-Length: nnnn SOAPAction: "urn:StockQuote#GetQuote" <s:Envelope xmlns:s="http://www.w3.org/2001/06/soapenvelope"> • ... • </s:Envelope> • L’header SOAPAction HTTP è definito dalle specifiche SOAP Il suo valore è completamente arbitrario, ma ha lo scopo di indicare al server HTTP cosa il messaggio intende chiedere prima che l’XML venga processato. SOAP 75