• Non ci sono risultati.

JAX-WS Calculator SOAP service

4.2 Servizi

4.2.1 JAX-WS Calculator SOAP service

Iniziamo dal servizio SOAP.

JAX-WS è una Java API per lo sviluppo veloce di applicazioni SOAP. Permette agli sviluppatori di scrivere messaggi RPC-oriented. Una volta creato il servizio in Java viene effettuato il deploy del suo file .war sul server Glassfish. Una volta effettuato il deploy, verrà generato, attraverso annota- zioni inserite nel codice, il documento descrittivo WSDL del servizio stesso.

Dal punto di vista Server, gli sviluppatori:

• definiscono le operazioni del web service attraverso metodi all’interno di un’interfaccia Java;

• creano classi che implementano tali interfacce e quindi di conseguenza tali operazioni.

Dal punto di vista del Client:

• viene creato un proxy, oggetto locale che rappresenta il servizio; • viene invocato il metodo.

Come prima cosa quindi è stata creata l’interfaccia del servizio SOAP: Listing 12: Interfaccia CalculatorSoap

p u b l i c i n t e r f a c e C a l c u l a t o r I n t e r f a c e {

p u b l i c f l o a t d o O p e r a t i o n ( S t r i n g o p e r a t i o n , i n t numUno , i n t numDue ) ; }

Il secondo passo è stato quello di implementare all’interno di una classe l’interfaccia.

Java API for XML-Based Web Services (JAX-WS) si basa sull’uso di an- notazioni utilizzate per specificare i metadati associati all’implementazione del web service e per semplificarne lo sviluppo.

Le annotazioni descrivono come un’implementazione server-side può es- sere acceduta come web service oppure come una classe Java client-side può accedere al web service stesso.

4.2 Servizi 4 PROG & IMP

Usando le annotazioni all’interno di codice Java, si semplifica lo sviluppo e il deploy di un servizio web, definendo alcune informazioni aggiuntive che sono solitamente ottenute da un file di descrittivo, file WSDL, o mappando metadata da XML e WSDL all’interno di artefatti.

Le annotazioni sono usate per configurare il binding, settare il nome del portType, del servizio e di altri parametri WSDL. Sono usate per mappare attraverso Java lo schema WSDL, e a runtime per controllare come JAX- WS processa e risponde alle invocazioni del web service.

In particolare quindi, il codice di tale classe deve contenere tali annota- zioni JAX-WS, necessarie per fornire informazioni utili per la costruzione del file WSDL:

• Il target namespace del servizio;

• La classe che racchiude il messaggio di richiesta; • La classe che racchiude il messaggio di risposta; • Se l’operazione è di tipo One-way;

• Il tipo di stile di Binding;

• Il namespace dei tipi usati dal servizio. Le due annotazioni principali utilizzate sono:

• @WebService (richiesto), che definisce che il metodo a seguire rappre- senta l’end point del servizio (SEI). All’interno di esso è stato definito il nome del servizio (serviceName).

• @SOAPBinding, indica il tipo di binding; di default il tipo di bin- ding è Wrapped. Nel nostro caso era necessario che non fosse di tipo Wrapped quindi sono stati definiti lo stile RPC (style) e lo stile dei parametri Bare (parameterStyle).

4.2 Servizi 4 PROG & IMP

Listing 13: Implementazione classe CalculatorSoap

@WebService ( s e r v i c e N a m e =" C a l c u l a t o r S e r v i c e " )

@SOAPBinding ( s t y l e =S t y l e . RPC, p a r a m e t e r S t y l e=SOAPBinding . P a r a m e t e r S t y l e .BARE) p u b l i c c l a s s C a l c u l a t o r i m p l e m e n t s C a l c u l a t o r I n t e r f a c e {

p u b l i c C a l c u l a t o r ( ) { }

[ . . . ] }

Una volta settato il SEI (Service Endpoint Implementation), il passo successivo è quello di definire il metodo del servizio ed aggiungergli le rela- tive annotazioni.

@WebMethod, è l’annotazione che definisce il metodo che rappresenta l’operazione del servizio. E’ stato definito il nome dell’operazione (opera- tionName)

Dovendo noi avere i parametri in input del metodo ben definiti con determinati nomi nel documento WSDL, nel metodo Java essi sono stati delineati attraverso l’annotazione @WebParam.

Tale annotazione personalizza il mapping di un parametro al "part" del web service message.

Listing 14: Metodo doOperation - CalculatorSoap

@WebMethod ( o p e r a t i o n N a m e =" d o O p e r a t i o n " ) p u b l i c f l o a t d o O p e r a t i o n (

@WebParam ( name=" o p e r a t i o n " , partName=" O p e r a t i o n T y p e " )

S t r i n g o p e r a t i o n , @WebParam ( name="num1 " , partName="NumeroUno " ) i n t numUno ,

@WebParam ( name="num2 " , partName="NumeroDue " ) i n t numDue ) { [ . . . ]

}

Una volta effettuato il deploy di tale servizio sul server glassfish, il web service sarà utilizzabile da un eventuale client e sarà generato il relativo WSDL.

4.2 Servizi 4 PROG & IMP Listing 15: WSDL CalculatorSoap < d e f i n i t i o n s xmlns : wsu=" h t t p : / / d o c s . o a s i s −open . o r g / ws s / 2 0 0 4 / 0 1 / o a s i s −200401− wss−w s s e c u r i t y −u t i l i t y − 1 . 0 . x s d " xmlns : wsp=" h t t p : / /www. w3 . o r g / n s /ws−p o l i c y " xmlns : wsp1_2=" h t t p : / / s c h e m a s . x m l s o a p . o r g / ws / 2 0 0 4 / 0 9 / p o l i c y " xmlns : wsam=" h t t p : / /www. w3 . o r g / 2 0 0 7 / 0 5 / a d d r e s s i n g / m e t a d a t a " xmlns : s o a p =" h t t p : / / s c h e m a s . x m l s o a p . o r g / w s d l / s o a p / " xmlns : t n s =" h t t p : / / c a l c u l a t o r . s e r v i c e / " xmlns : x s d =" h t t p : / /www. w3 . o r g / 2 0 0 1 /XMLSchema " xmlns =" h t t p : / / s c h e m a s . x m l s o a p . o r g / w s d l / " t a r g e t N a m e s p a c e =" h t t p : / / c a l c u l a t o r . s e r v i c e / " name=" C a l c u l a t o r S e r v i c e "> <t y p e s /> <!−− MESSAGE −−> <m e s s a g e name=" d o O p e r a t i o n "> <p a r t name=" O p e r a t i o n T y p e " t y p e =" x s d : s t r i n g "/> <p a r t name="NumeroUno " t y p e =" x s d : i n t "/> <p a r t name="NumeroDue " t y p e =" x s d : i n t "/> </m e s s a g e> <m e s s a g e name=" d o O p e r a t i o n R e s p o n s e "> <p a r t name=" r e t u r n " t y p e =" x s d : f l o a t "/> </m e s s a g e> <!−− PORTTYPE −−> <p o r t T y p e name=" C a l c u l a t o r "> <o p e r a t i o n name=" d o O p e r a t i o n " p a r a m e t e r O r d e r =" O p e r a t i o n T y p e NumeroUno NumeroDue"> <i n p u t wsam : A c t i o n =" h t t p : / / c a l c u l a t o r . s e r v i c e / C a l c u l a t o r / d o O p e r a t i o n R e q u e s t " m e s s a g e =" t n s : d o O p e r a t i o n "/> <o u t p u t wsam : A c t i o n =" h t t p : / / c a l c u l a t o r . s e r v i c e / C a l c u l a t o r / d o O p e r a t i o n R e s p o n s e " m e s s a g e =" t n s : d o O p e r a t i o n R e s p o n s e "/> </ o p e r a t i o n > </port Type> <!−− BINDING −−> <b i n d i n g name=" C a l c u l a t o r P o r t B i n d i n g " t y p e =" t n s : C a l c u l a t o r "> <s o a p : b i n d i n g t r a n s p o r t =" h t t p : / / s c h e m a s . x m l s o a p . o r g / s o a p / h t t p " s t y l e =" r p c "/> <o p e r a t i o n name=" d o O p e r a t i o n "> <s o a p : o p e r a t i o n s o a p A c t i o n =""/> <i n p u t > <s o a p : body u s e =" l i t e r a l " n a m e s p a c e =" h t t p : / / c a l c u l a t o r . s e r v i c e /"/ > </i n p u t > <o u t p u t> <s o a p : body u s e =" l i t e r a l " n a m e s p a c e =" h t t p : / / c a l c u l a t o r . s e r v i c e /"/ > </o u t p u t> </ o p e r a t i o n > </ b i n d i n g > < s e r v i c e name=" C a l c u l a t o r S e r v i c e "> <p o r t name=" C a l c u l a t o r P o r t " b i n d i n g =" t n s : C a l c u l a t o r P o r t B i n d i n g "> <s o a p : a d d r e s s l o c a t i o n =" h t t p : / / macbook−d i −mavi . l o c a l : 8 0 8 0 / C a l c u l a t o r S o a p / C a l c u l a t o r S e r v i c e "/> </p o r t > </ s e r v i c e > </ d e f i n i t i o n s > 70

4.2 Servizi 4 PROG & IMP

Una volta creato il servizio SOAP e il relativo documento WSDL, è possibile creare il client.

Per effettuare una chiamata trasparente, è stato necessario effettuare una chiamata del servizio dinamica.

La chiamata del servizio in modo dinamico è stata implementata uti- lizzando sempre le librerie di JAX-WS. Essa si può delineare nei seguenti passaggi:

1. Creare un servizio ed aggiungerne almeno un endpoint. L’end point viene ricavato dal grounding del servizio preso in esame dal manager.

Listing 16: WSDL CalculatorSoap

S e r v i c e s e r v i c e = S e r v i c e . c r e a t e ( s e r v i c e Q N ) ;

s e r v i c e . a d d P o r t ( portName , SOAPBinding . SOAP11HTTP_BINDING, e n d p o i n t ) ;

2. Creare un’istanza di dispatch dal servizio, delineando sempre quella che è la porta di riferimento.

Listing 17: WSDL CalculatorSoap

D i s p a t c h <SOAPMessage> d i s p a t c h =

4.2 Servizi 4 PROG & IMP

3. Creare la richiesta SOAPMessage. La richiesta viene effettuata crean- do il suo SOAPEnvelope e il relativo SOAPBody.

Listing 18: WSDL CalculatorSoap // c o m p o r r e un m e s s a g g i o d i r i c h i e s t a M e s s a g e F a c t o r y mf = M e s s a g e F a c t o r y . n e w I n s t a n c e ( SOAPConstants . SOAP_1_1_PROTOCOL ) ; // C r e a r e un m e s s a g g i o . SOAPMessage r e q u e s t = mf . c r e a t e M e s s a g e ( ) ; SOAPPart p a r t = r e q u e s t . getSOAPPart ( ) ; // O t t e n e r e i l SOAPEnvelope e g l i e l e m e n t i i n t e s t a z i o n e e c o r p o . SOAPEnvelope env = p a r t . g e t E n v e l o p e ( ) ;

SOAPBody body = env . g e t B o d y ( ) ; // C r e a r e i l p a y l o a d d i m e s s a g g i o . SOAPElement o p e r a t i o n = body . a d d C h i l d E l e m e n t ( n a me O pe r at io n , " n s 2 " , n a m e s p a c e ) ; f o r ( i n t i =0; i <i n p u t s . s i z e ( ) ; i ++){ SOAPElement v a l u e = o p e r a t i o n . a d d C h i l d E l e m e n t ( p a r a m e t e r s . g e t ( i ) ) ; v a l u e . addTextNode ( i n p u t s . g e t ( i ) ) ; } r e q u e s t . s a v e C h a n g e s ( ) ;

4. Gestire ed elaborare la risposta del server.

Listing 19: WSDL CalculatorSoap

/∗∗ E l a b o r a r e l a r i s p o s t a . ∗∗/

SOAPMessage r e s p o n s e = d i s p a t c h . i n v o k e ( r e q u e s t ) ;

4.2 Servizi 4 PROG & IMP

Documenti correlati