Sei sulla pagina 1di 46

Web Services

1
Obiettivi

• Introdurre i concetti fondamentali sui WebServices


• Capire SOAP e WSDL
• Come usare i WebService in JEE6
• Handler Chains

JEE6 - WebServices - v1.4 2


Web Services

• Servizi di business esposti con i seguenti criteri:


• Indipendente dal linguaggio e dalla piattaforma
• Protocollo di comunicazione basato su XML (SOAP)
• Accessibili (anche) mediante il protocollo HTTP

JEE6 - WebServices - v1.4 3


Necessità

• B2B e B2C
• Integrare multi-piattaforma
• firewall-friendly
• superare i limiti delle tecnologie precedenti (ad es. CORBA)
• integrare servizi trasversali (ad es. autenticazione,
crittografia, single sign-on, ...)
• supportare standard verticali (ebXML,
amministrazione pubblica, ...)

JEE6 - WebServices - v1.4 4


Proprietà fondamentali

• Distribuito
• Grana grossa
• Auto-descrittivo
• Lascamente accoppiato
• Sincrono o asincrono
• RPC o document based
• Non confondere con la codifica SOAP
• Basato su standard
• Non indissolubilmente legato ad un protocollo di trasporto
JEE6 - WebServices - v1.4 5
SOA - Service Oriented Architecture

• Stile architetturale
• Basato su servizi esposti in rete
• Federazioni di servizi
• Riuso di servizi ed infrastrutture

JEE6 - WebServices - v1.4 6


Caratteristiche

• Servizio esposto descritto da WSDL


• SOAP è alla base dei protocolli applicativi
• HTTP/HTTPS come protocollo di trasporto
• Registro UDDI

JEE6 - WebServices - v1.4 7


Alternative

• Representational State Transfer (REST)


• Descritto oltre

JEE6 - WebServices - v1.4 8


Architettura

• Sender
• Spedisce il messaggio / inizia la conversazione
• Intermediate
• Opzionali
• Processano solo l’Header
• Receiver
• Riceve il messaggio
• Ultimate Sender e Ultimate Receiver
• Sincrono o asincrono
JEE6 - WebServices - v1.4 9
IDL: interface definition language

• Valida lo schema dei messaggi


• Fornisce metadati per l’invocazione dinamica
• Utile per gli intermediari
• Permette la generazione automatica degli stub

JEE6 - WebServices - v1.4 10


Descrivere un WebService

• Che protocollo?
• Che formato applicativo per richiesta e risposta?
• Quale supporto per la sicurezza?
• Qual è l’URL del servizio?

JEE6 - WebServices - v1.4 11


Struttura di un WSDL
• definitions
• import: riferimenti opzionali ad altri documenti
• types: tipi dei dati che verranno trasmessi
• schemas: gli XSD necessari alle definizioni
• messages: quali messaggi vengono scambiati
• parts: i componenti di ogni messaggio
• portTypes: quali operazioni sono supportate
• operations: definiscono il nome delle operazioni e i messaggi

input: il messaggio di input

output: il messaggio di output

fault: i possibili messaggi di errore (eccezione)
• bindings: come sono mappate le operazioni al protocollo
• operations:

input:

output:
• service: descrizione complessiva del servizio
• port: gruppo di operazioni
JEE6 - WebServices - v1.4 12
Attenzione

• Esistono molte variazioni di formato con la stessa


(apparente) semantica
• Certe però non sono digerite da tutti i tool
• Dipende anche dall’encoding (vedasi oltre)
• Affidarsi sempre ad uno strumento di editing che
guida la generazione dei contenuti

JEE6 - WebServices - v1.4 13


WS-I

• http://www.ws-i.org/
• Iniziativa del consorzio OASIS
• Garantisce un livello di interoperabilità minima
• Basic Profile (WSI-BP)
• 1.2: MTOM e WS-Addressing
• 2.0: SOAP 1.2 e WS-Addressing
• Metro, Axis, XFire, CXF, WebLogic, ASP .NET 2.0,
WebSphere, Axis (1.0), Axis 2, gSOAP

JEE6 - WebServices - v1.4 14


SOAP

• Simple Object Access Protocol


• Regole di codifica dei dati
• Struttura estendibile
• Strategia per il binding a un protocollo di trasporto
• SOAP v1.1 vs SOAP v1.2
• SOAP with Attachments

JEE6 - WebServices - v1.4 15


Struttura di un messaggio SOAP

• Message
• Envelope
• Header
• Header Entries
• Body
• Gli attachment possono stare fuori dal body (es. MTOM)

JEE6 - WebServices - v1.4 16


SOAP Envelope

• Definisce i namespace XML globali


• Dichiara lo stile di codifica
• Contiene opzionalmente l’Header
• Contiene il Body

JEE6 - WebServices - v1.4 17


SOAP Header

• Contiene una o più Header Entry


• Non può contenere carico utile (payload)
• Può supportare servizi aggiuntivi
• Sicurezza
• Transazioni
• Routing
• Tipicamente processato da un intermediario
• Possono essere definite Header Entries custom
• Possono essere ignorate da intermediari
• se mustUnderstand=1 devono essere processate
JEE6 - WebServices - v1.4 18
Codifiche SOAP

• Cinque tipi di codifica


• RPC/Encoded
• RPC/Literal
• Document/Encoded (non usato)
• Document/Literal
• Document/Literal Wrapped
• RPC vs Document non è relativo all’intento
• Pertinente solo alla codifica
• http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
JEE6 - WebServices - v1.4 19
RPC/Encoded

• Vantaggi public void myMethod(int x, float y);

• Semplice <soap:envelope>
• Il nome dell’operazione
è esplicito
<soap:body>
<myMethod>
<x xsi:type="xsd:int">5</x>
• Svantaggi <y xsi:type="xsd:float">5.0</y>


</myMethod>
Verboso per ogni </soap:body>
parametro </soap:envelope>

• I messaggi non sono


validabili in toto
• Non compatibile WS-I

JEE6 - WebServices - v1.4 20


RPC/Literal

• Vantaggi public void myMethod(int x, float y);

• Semplice <soap:envelope>

• Meno verboso <soap:body>


<myMethod>
• Ilè nome dell’operazione
esplicito
<x>5</x>
<y>5.0</y>
</myMethod>
• Compatibile WS-I </soap:body>

• Svantaggi </soap:envelope>

• Ivalidabili
messaggi non sono
in toto

JEE6 - WebServices - v1.4 21


Document/Literal

• Vantaggi
• Può essere validato in toto public void myMethod(int x, float y);
• Svantaggi
• WSDL più complesso
(deve definire schema)
<soap:envelope>
<soap:body>
<xElement>5</xElement>

• Non c’è il nome


dell’operazione (SOAP
<yElement>5.0</yElement>
</soap:body>
</soap:envelope>
Action richiesta)
• Non compatibile
WS-I se più di un
elemento dentro Body
JEE6 - WebServices - v1.4 22
Document/Literal Wrapped
• Vantaggi
• Può essere validato in toto public void myMethod(int x, float y);

• C’è il nome
dell’operazione
<soap:envelope>
<soap:body>

• Inunrealtà
<myMethod>
è il nome di <x>5</x>
messaggio, ma <y>5.0</y>
</myMethod>
viene fatto coincidere </soap:body>
• Compatibile WS-I </soap:envelope>

• Svantaggi
• WSDL ancora più complesso
• Non supporta overload
delle operazioni
JEE6 - WebServices - v1.4 23
SOAP Fault

• Contenuto nel body della risposta


• Rappresenta un errore
• Corrisponde ad un’eccezione in Java
• Campi
• faultCode: identificativo da vocabolario
• faultString: spiegazione leggibile da essere umano
• faultActor: origine dell’errore
• detail: informazioni aggiuntive
JEE6 - WebServices - v1.4 24
SOAP Esempio

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope">
<env:Header>
  <n:alertcontrol xmlns:n="http://example.org/alertcontrol">
<n:priority>1</n:priority>
<n:expires>2001-06-22T14:00:00-05:00</n:expires>
  </n:alertcontrol>
</env:Header>
 <env:Body>
  <m:alert xmlns:m="http://example.org/alert">
<m:msg>Pick up Mary at school at 2pm</m:msg>
  </m:alert>
</env:Body>
</env:Envelope>

JEE6 - WebServices - v1.4 25


SOAP Esempio HTTP Request
POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: ...
SOAPAction: "http://example.org/2001/06/quotes"

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >


<env:Body>
<m:GetLastTradePrice
env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"
xmlns:m="http://example.org/2001/06/quotes">
<symbol>DIS</symbol>
</m:GetLastTradePrice>
</env:Body>
</env:Envelope>

JEE6 - WebServices - v1.4 26


SOAP Esempio HTTP Response

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: ...

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >


<env:Body>
<m:GetLastTradePriceResponse
env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"
xmlns:m="http://example.org/2001/06/quotes">
<Price>34.5</Price>
</m:GetLastTradePriceResponse>
</env:Body>
</env:Envelope>

JEE6 - WebServices - v1.4 27


SOAP Esempio Fault

<env:Envelope xmlns:env='http://www.w3.org/2001/06/soap-envelope'
xmlns:f='http://www.w3.org/2001/06/soap-faults' >
<env:Header>
<f:Misunderstood qname='abc:Extension1'
xmlns:abc='http://example.org/2001/06/ext' />
<f:Misunderstood qname='def:Extension2'
xmlns:def='http://example.com/stuff' />
</env:Header>
<env:Body>
<env:Fault>
<faultcode>MustUnderstand</faultcode>
<faultstring>One or more mandatory headers not understood</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>

JEE6 - WebServices - v1.4 28


SOAP Action (1.1)
• Indica l’intento della chiamata
• Può essere usata per filtrare la richiesta
• Non è un Header Entry SOAP, ma un Header HTTP
• WS-I Basic Profile raccomanda l’uso delle “”
• Ridondante?
• p.es. se in document style non c’è nome della chiamata nel Body
• Necessaria in metodi“overloaded” (stesso nome,diversi parametri)
• Nell’header HTTP è più veloce da processare
POST /StockQuote HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Content-Length: ...
SOAPAction: "http://acme.com/abc#MyMessage"

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >


...
</env:Envelope>
JEE6 - WebServices - v1.4 29
SOAP Action (1.2)

• L’informazione
Content-Type:
va spostata nel parametro Action del

POST /StockQuote HTTP/1.1


Content-Type: text/xml; charset="utf-8";action="http://acme.com/abc#MyMessage"
Content-Length: ...

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >


...
</env:Envelope>

JEE6 - WebServices - v1.4 30


Tecnologie Java per i WebService

• JAX-RPC: SOAP (deprecato)


• JAX-WS: SOAP
• JAX-RS: REST
• JAXR: UDDI
• JAXB: serializzazione in XML/JSON
• JAXP: API per la manipolazione dell’XML

JEE6 - WebServices - v1.4 31


JAXB

• Tecnologia per serializzare automaticamente oggetti


Java in XML & JSON
• Basata su annotazioni
• Può essere usata in stand-alone
• Viene usata implicitamente da JAX-WS e JAX-RS

JEE6 - WebServices - v1.4 32


Esporre un Web Service Java

• “WSDL first”
• disegnare WSDL e generare il codice Java server
• il client (Java o altro) viene generato dal WSDL
• approccio migliore e più inter-operabile
• “Java first”
• disegnare l'interfaccia Java e annotarla con @WebService
• il client Java è l'interfaccia stessa
• l'application server espone automaticamente il WSDL
• ok per Java-to-Java, può essere problematico altrimenti
JEE6 - WebServices - v1.4 33
Accedere ad un WS SOAP

• Il codice viene generato da WSDL


• wsimport o tool equivalenti


HelloWorldImplService ws = new HelloWorldImplService();


HelloWorld port = ws.getHelloWorldImplPort();


String result = port.hello("John");

JEE6 - WebServices - v1.4 34


Esercizio 1

• Esporre un semplice servizio “Java first”


• Per Tomcat, installare le estensioni Metro
• ant -Dtomcat.home=TomcatPath -f metro-2.2.1/
metro-on-tomcat.xml install
• Scrivere un semplice client

JEE6 - WebServices - v1.4 35


Soap UI

JEE6 - WebServices - v1.4 36


Handler Chains

• API per la customizzazione del processamento


• Catena di handler
• sul client
• sul server
• SOAPHandler: può accedere alla busta
• LogicalHandler: può accedere solo al payload

JEE6 - WebServices - v1.4 37


Esercizio 2

• Usare Handler Chain sul client e server


• Esempio: iniettare un token e verificarne la presenza

JEE6 - WebServices - v1.4 38


Altre annotazioni
• @SOAPBinding
• style: DOCUMENT, RPC (default DOCUMENT)
• use: LITERAL, ENCODED (default LITERAL)
• parameterStyle: BARE, WRAPPED (default WRAPPED)
• @WebMethod per specificare opzioni per metodo
• operationName: specifica un nome diverso dal metodo
• action: specifica la SOAP Action
• exclude: non espone il metodo come operazione
• @WebParam per specificare opzioni per parametro
• name: specifica un nome (altrimenti è anonimo: argn)
• mode: IN/OUT, usato con parametri holder
• header: specifica che il parametro sta nello header
• partName: specifica la part del messaggio da usare
• targetNameSpace: specifica il namespace
JEE6 - WebServices - v1.4 39
@WebServiceProvider
• Permette di implementare un WS “dinamico”
• Utile per certi tipi di Intermediari
• Parametri
• wsdlLocation
• serviceName
• portName
• targetNameSpace
• La classe implementa javax.xml.ws.Provider<T>
• Unico metodo invocato
• public T invoke (T request);
• @ServiceMode
• Service.Mode.MESSAGE: T è SOAPMessage
• Service.Mode.PAYLOAD: T è LogicalMessage
JEE6 - WebServices - v1.4 40
WebServiceContext

• Risorsa che può essere iniettata con @Resource


• Fornisce
• getMessageContext()
• getUserPrincipal()
• isUserInRole()
• MessageContext
• Fornisce
corrente
varie proprietà relative al messaggio

• Alcune visibili a tutti


• Alcune visibili solo agli Handler
JEE6 - WebServices - v1.4 41
WSIT

• Cappello di tecnologie e best-practices per


l’integrazione multipiattaforma
• MTOM (ottimizzazione messaggi)
• Sicurezza (a livello di trasporto e di messaggio)
• Altro
• http://docs.oracle.com/cd/E19159-01/820-1072/

JEE6 - WebServices - v1.4 42


MTOM
• xs:base64Binary ha una tipica inefficienza del 33%
• Ottimizzazione della trasmissione di contenuti binari
• Consigliato per contenuti più grandi di qualche kb
• Tipicamente usato con XOP
Content-Type: Multipart/Related; start-info="text/xml"; type="application/
xop+xml"; boundary="----=_Part_0_1744155.1118953559416"
Content-Length: 3453
SOAPAction: ""

------=_Part_1_4558657.1118953559446
Content-Type: application/xop+xml; type="text/xml"; charset=utf-8

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <Detail xmlns="http://example.org/mtom/data">
      <image>
        <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/
include" href="cid:5aeaa450-17f0-4484-b845-a8480c363444@example.org" />
      </image>
    </Detail>
  </S:Body>
</S:Envelope>

------=_Part_1_4558657.1118953559446
Content-Type: image/jpeg
Content-ID: <5aeaa450-17f0-4484-b845-a8480c363444@example.org>

... binary data ...
JEE6 - WebServices - v1.4 43
Attivare MTOM

• Sul server
• @MTOM (implementazione endpoint
• deployment descriptor
• Sul client stand-alone
• Tipicamente non necessario (si attiva via WSDL)
• Eventualmente esplicito via client feature
• Soglia configurabile
• @MTOM(threshold=2000)
JEE6 - WebServices - v1.4 44
Esercizio 3

• Sviluppare un web service “WSDL-first”

JEE6 - WebServices - v1.4 45


Riepilogo

• Domande e risposte

JEE6 - WebServices - v1.4 46

Potrebbero piacerti anche