• Non ci sono risultati.

Generazione di applicazioni clienti

Capitolo 7 Servizi Web

7.5 Il toolkit gSOAP

7.5.3 Generazione di applicazioni clienti

In questo paragrafo spiegheremo come creare un’applicazione che utilizza un Web Service esistente.

7.5 Il toolkit gSOAP

L’implementazione di un’applicazione cliente SOAP richiede una stub routine per ogni metodo remoto (del Web Service) che l’applicazione vuole invocare. I compiti principali dello stub sono di analizzare i parametri, inviare la richiesta con i parametri al servizio, attendere la risposta. L’applicazione cliente invoca la stub routine di un metodo remoto come se invocasse un metodo locale. Scrivere a mano una stub routine in C o C++ è un’operazione lunga e noiosa, specialmente se i parametri di input e/o output del metodo remoto contengono dati strutturati, come record o array. Fortunatamente, il parser WSDL gSOAP wsdl2h e il compilatore per stub e skeleton soapcpp2 automatizzano lo sviluppo dell’infrastruttura di comunicazione per le applicazioni clienti e server di un Web Service.

Consideriamo il comando seguente:

$ wsdl2h -o quote.h

http://services.xmethods.net/soap/urn:xmethods-

delayed-quotes.wsdl

Viene generato il file quote.h in formato C++ partendo dal WSDL specificato dall’URL. Il file header quote.hva poi elaborato con il compilatore gSOAP. I metodi del servizio remoto sono specificati nel file header come prototipi di funzioni. Le routine in C/C++ dei prototipi di funzione presenti nel file header per lo stub sono generate automaticamente dal compilatore gSOAP. Le stub routine risultanti consentono a applicazioni clienti scritte in C/C++ di interagire con il Web Service.

Il compilatore gSOAP genera anche le routine skeleton per ognuno dei metodi remoti specificati nel file header. Le routine skeleton possono essere usate per implementare uno o più dei metodi remoti in un nuovo Web Service, quindi non devono essere usate per costruire clienti in C++, ma si possono usare per costruire il lato server di applicazioni di tipo client/server.

I parametri di input o di output di un metodo del servizio possono essere sia tipi di dati semplice sia tipi di dati composti, e possono essere sia generati dal parser WSDL sia specificati a mano. Il compilatore gSOAP stub e skeleton automaticamente genera i serializers e i deserializers per i tipi di dati strutturati in modo che le routine di stub generate possano codificare e decodificare il contenuto dei parametri dei metodi remoti in XML.

dettagli necessari al compiler gSOAP per generare la stub routine per un’applicazione cliente che vuole interagire con il servizio.

Il compilatore gSOAP usa la convenzione che l’ultimo parametro del prototipo della funzione deve essere il parametro di uscita del metodo remoto, e questo parametro deve essere passato per riferimento utilizzando l’operatore & o utilizzando un puntatore. Tutti gli altri parametri eccetto l’ultimo sono parametri di ingresso del metodo remoto, e devono essere passati per valore o usando un puntatore al valore (non è consentito il passaggio per riferimento). Il prototipo della funzione associato a un metodo remoto deve restituire un int, il cui valore indica al chiamante se la connessione a un Web Service ha avuto successo o meno. Nel file header viene aggiunto un prefisso della forma ns1__ al nome del metodo remoto nel Web Service. Questo prefisso namespace (vedi paragrafo 7.5.2) è contraddistinto da una coppia di underscores nel nome della funzione, ad esempio si può avere un prototipo chiamato ns1__nomeremoto dove ns1 è il namespace prefix e nomeremoto e il nome del metodo remoto. (Si usa il doppio underscore perché un underscore singolo in un nome viene tradotto con un trattino in XML, dato che molto frequentemente in XML i trattini sono equiparati agli underscores).

Il compilatore gSOAP viene invocato da linea di comando con la seguenti sintassi:

soapcpp2 esempio.h

Il compilatore genera la stub routine per i metodi remoti specificato nell’header file esempio.h. Queste stub routine possono essere chiamate da un programma cliente per richiedere i servizi del Web Service.

L’interfaccia della stub routine generata è il seguente prototipo di funzione generato dal compilatore gSOAP:

int soap_call_ns1__nomeremoto(struct soap *soap, char *URL, char *action, [input parameters], [output parameter]);

La stub routine viene salvata nel file soapClient.cpp. Il file soapC.cpp contiene invece il serializer e il deserializer per i tipi di dati usati dallo stub.

I parametri della funzione soap_call_ns1__nomeremoto sono:

soap deve essere un puntatore valido a un ambiente runtime gSOAP.

7.5 Il toolkit gSOAP

action è una stringa che denota l’azione SOAP richiesta dal Web service.

input parameters sono parametri di ingresso del metodo remoto, e

devono essere passati per valore o usando un puntatore al valore (non è consentito il passaggio per riferimento).

output parameter è il parametro di uscita del metodo remoto, e questo parametro deve essere passato per riferimento utilizzando l’operatore & o utilizzando un puntatore.

Se l’esecuzione della stub routine ha successo, viene restituito SOAP_OK e

output parameter contiene il risultato desiderato. Altrimenti c’è stato un errore e il fallimento SOAP può essere comunicato attraverso la funzione

soap_print_fault.

Le funzioni in tabella 7-3 possono essere usate per gestire un ambiente runtime gSOAP (struct soap).

Function Description

soap_init(struct soap

*soap) Initializes a runtime environment (required only once)

soap_init1(struct soap

*soap, soap_mode iomode) Initializes a runtime environment and set in/out mode flags

soap_init2(struct soap *soap, soap_mode imode, soap_mode omode)

Initializes a runtime environment and set separate in/out mode flags

struct soap *soap_new() Allocates, initializes, and returns a pointer to a runtime environment struct soap

*soap_new1(soap_mode iomode)

Allocates, initializes, and returns a pointer to a runtime environment and set in/out mode flags

struct soap

*soap_new2(soap_mode imode, soap_mode omode)

Allocates, initializes, and returns a pointer to a runtime environment and set separate in/out mode flags

struct soap

*soap_copy(struct soap *soap)

Allocates a new runtime environment and copies contents of the argument environment such that the new environment does not share data with the argument environment

soap_done(struct soap

remote dal lato client e non occorre quindi che sia reinizializzato ogni volta. Un nuovo ambiente è invece richiesto se si usano i thread e se si vuole garantire ad un thread accesso esclusivo. Anche l'utilizzo di una chiamata client all'interno di un metodo di un servizio (cioè quando un servizio diventa cliente di un altro servizio) richiede un nuovo ambiente.

Un programma cliente può invocare un metodo remoto in ogni momento e anche più volte, ad esempio in un ciclo.

Documenti correlati