Giandomenico's page
home

Realizzare un Web Service client e server con Visual Basic 6

Introduzione

Sicuramente molti di voi hanno sentito parlare o letto dei Web services. Ad una prima analisi puo sembrare una tecnologia complessa, riservata ai professionisti di Internet ed alle aziende, e che richiede necessariamente l'uso di linguaggi specifici come Java, o C#.

In questo articolo faremo invece vedere come e semplice realizzare un Web service, sia nella parte client che nella parte server, avvalendoci solamente del classico ambiente di sviluppo Visual Basic 6 e di un apposito toolkit distribuito da Microsoft.

Panoramica sui Web Services

I Web services sono una tecnologia rivolta alla realizzazione di applicazioni distribuite. Si parla di applicazioni distribuite quando il codice eseguibile ed i dati sono fisicamente divisi in 2 o piu calcolatori (pc od altro) , ma l'applicazione e unica da un punto di vista logico e non e influenzata dalla topologia (forma) della rete in cui sono distribuiti i calcolatori.

Chiaramente i vari pezzi di applicazione situati nelle diverse macchine devono in qualche modo colloquiare tra loro, per svolgere le funzionalità per cui l'applicazione e stata sviluppata. La situazione si puo paragonare ad una applicazione costituita da diverse librerie (DLL in Windows), che pero sono poste su diverse macchine e comunicano per mezzo della rete.

In passato sono state usate diverse soluzioni. Da un punto di architettura del sistema esistono sistemi basati su Remote Procedure Call (RPC), e sistemi basati sullo scambio di messaggi. Dal punto di vista delle implementazioni pratiche, ricordiamo: il protocollo CORBA, che e indipendente dal sistema operativo e dal linguaggio; il protocollo DCOM, specifico per Windows; Java Remote Method Invocation (RMI), specifico di Java e dei sistemi che lo supportano.

Senza entrare nel dettaglio, si puo dire che ognuno di queste architetture e realizzazioni pratiche ha dei pregi e dei difetti:

I progettisti delle specifiche dei Web services si sono posti l'obiettivo di risolvere questi problemi, cercando di utilizzare altri standard che attualmente sono di larghissimo uso: il protocollo di trasmissione HTTP, ed il linguaggio di strutturazione dati XML.

L'HTTP e il protocollo usato correntemente per tutto lo scambio dati del Web, e pertanto tutti i web servers ed i clients (i browsers) sono perfettamente capaci di capirlo, senza nessuna modifica particolare.

L'XML e ormai lo standard di descrizione e strutturazione dei dati: si puo dire che per ogni sistema operativo e per ogni linguaggio esiste una libreria già bell'e pronta per leggere e costruire files XML. Ed inoltre i web servers sono capaci di gestire opportunamente i dati in XML.

Il gruppo di standardizzazione dei Web services ha quindi preparato 3 specifiche:

Queste 3 specifiche consentono di realizzare applicazioni distribuite complete, indipendenti dal sistema operativo e dal linguaggio, ed utilizzando l'infrastruttura già esistente ed ampiamente sperimentata del Web.

Aggiungiamo che la sicurezza delle comunicazioni viene affrontata tramite cifratura SSL e metodi di autenticazione con userid e password, ed anche queste sono tecnologie già usate normalmente sul Web.

Possiamo notare che i Web services si avvicinano per alcuni aspetti ai sistemi di scambio messaggi (Message Queue), infatti SOAP e una specifica di realizzazione di messaggi; per altri versi sono piu vicini ai sistemi RPC, infatti ancora SOAP specifica i parametri di input ed i risultati di output del service.

Requisiti del sistema

L'esempio che realizzeremo richiede naturalmente l'ambiente di sviluppo Visual Basic 6, ed inoltre il Microsoft SOAP Toolkit 3.0, scaricabile da:

http://www.microsoft.com/downloads/details.aspx?familyid=c943c0dd-ceec-4088-9753-86f052ec8450&languageid=f49e8428-7071-4979-8a67-3cffcb0c2524&displaylang=en

Il client puo essere usato su tutte le versioni di Windows, da 98 in poi.

Il server richiede Windows NT 4 sp 6, 2000 , o XP . Inoltre bisogna installare Internet Information Services, che e uno dei componenti compresi nel CD di Windows (nella versione Windows 2000 od XP Professional IIS 5 e presente in una versione ridotta che supporta al massimo 8-10 utenti contemporanei, mentre nelle versioni Server e presente la versione completa del prodotto).

Come prima cosa, quindi, va scaricato il Microsoft Soap Toolkit 3.0 e va installato sulla macchina dove vogliamo sviluppare il nostro esempio.

Dopo, se già non e presente, va installato il web server IIS, come componente aggiuntivo di Windows.

Il server

Il server e costituito da una normale libreria DLL ActiveX, che espone il metodo che noi invocheremo nel nostro esempio.

Apriamo l'ambiente Visual Basic 6, creiamo un nuovo progetto del tipo DLL ActiveX, e chiamiamolo Esempio.

Nella classe di default creata, Class1, aggiungiamo una nuova funzione ConvertiEuro:

Public Function ConvertiEuro(lire As Integer) As single
convertiEuro = lire / 1936.27
End Function

Compiliamo la DLL, e salviamo il progetto. Abbiamo ottenuto il nostro server Esempio.DLL, il quale espone un metodo per convertire da lire ad euro.

La generazione del WSDL

Per poter usare la nostra DLL come web service dobbiamo preparare un file di descrizione nello standard WSDL.

Potremmo farlo a mano, ma nel toolkit e presente un comodo assistente che ci consente di generarlo in modo molto piu semplice e guidato.

Dopo l'installazione del toolkit, nel menu Start/programmi e presente la nuova voce Microsoft Soap Toolkit version 3, dentro selezioniamo WSDL Generator.

Viene avviato l'assistente, o generatore. Andiamo avanti dalla schermata iniziale premendo Next,

saltiamo la schermata Specify configuration [optional] premendo ancora Next.

Ci troviamo ora nella schermata di assegnazione del nome del servizio: scriviamo SoapTest. Premendo Select COM object scegliamo Esempio.DLL . Andiamo avanti con Next.

Nella pagina successiva viene chiesto di indicare quale funzione o procedura va esposta nel service.

Mettiamo il check su ConvertiEuro ed andiamo avanti ciccando su Next.

Successivamente dobbiamo indicare l'indirizzo HTTP che avrà il nostro service, ed il suo tipo.

Scriviamo l'indirizzo, selezioniamo il tipo listener ASP, e proseguiamo con Next.

Possiamo lasciare nella schermata successiva i default e proseguire con Next.

Dopo la schermata chiede il tipo di codifica carattere, lasciamo UTF-8; e le directory dove salvare il file WSDL, ed un file di configurazione dove il generatore salva tutto cio che abbiamo digitato, in modo da facilitare una nuova generazione. Lasciamo le directory del progetto Esempio, e proseguiamo con Next.

Finalmente siamo arrivati alla fine! Il nostro file WSDL e stato salvato. Viene anche salvato un file con estensione WGEN che e la configurazione del generatore con le digitazioni; ed un file di estensione WSML. Quest'ultimo e specifico della implementazione Microsoft del SOAP, e contiene informazioni speciali per consentire al server di accedere alle funzioni esposte dall'oggetto COM, ed al client di utilizzare dei tipi non standard come parametri e valore di ritorno (ad esempio per ottenere un oggetto di una classe Vb come ritorno del web service). Il generatore crea 2 files con estensione WSML: uno deve essere copiato sulla macchina server, l'altro (con il nome <nomeservizio>Client.wsml) e richiesto dal client solo se l'oggetto COM espone metodi che ritornano valori di tipo non standard: oggetti o record. Nel nostro caso il server ritorna un valore single, e pertanto il client non ha bisogno dello specifico file WSML (mentre il server ha sempre bisogno del suo file WSML, se il web service usa il toolkit!).

Selezionando il tipo ASP viene anche prodotto un file di estensione ASP, che costituisce la pagina di attivazione del servizio.

Una interessante osservazione e che in realtà qualunque libreria ActiveX COM puo essere usata come web service, tramite il toolkit! Non siamo limitati agli oggetti COM creati con VB, e neppure a quelli creati da noi stessi. Possiamo usare altri linguaggi e perfino librerie già create da altri. Tutto il lavoro di interfacciamento tra protocolli SOAP - WSDL e COM viene svolto dalle librerie del toolkit.

Il client

Il client puo essere preparato in vari modi e linguaggi. Cio e ovvia conseguenza del fatto che un web service e accessibile tramite SOAP e WSDL indipendentemente dal tipo di macchina o linguaggio di programmazione.

Nel nostro caso, scriviamo anche il client in Visual Basic.

Creiamo quindi un nuovo progetto VB di tipo EXE standard e chiamiamolo txsoap.

Nel form del progetto Form1 aggiungiamo un pulsante command1, e mettiamo come caption Soap.

Ora dobbiamo abilitare il nostro progetto all'uso delle librerie Soap Microsoft. Per fare questo, andiamo nel menu Progetto/Riferimenti, cerchiamo e selezioniamo con il check la libreria Microsoft Soap type library v3.0.

Fatto questo, andiamo nella sub Command1_Click di gestione del pulsante, ed scriviamo il seguente codice:

Private Sub Command1_Click()
Dim client As New MSSOAPLib30.SoapClient30
On Error GoTo fail
Call client.MSSoapInit("http://localhost/virtsoaptest/SoapTest.wsdl")
reply = client.convertieuro(15000)
MsgBox "ConvertiEuro(15000) = " & reply
Exit Sub
fail:
s = client.Detail
MsgBox client.Detail
End Sub

Come si vede, per prima cosa viene definito un nuovo oggetto SoapClient30, questo oggetto viene poi inizializzato proprio con la lettura del file Web Service Description (WSDL) creato prima. In questo modo, il nostro client acquisisce tuttle le informazioni sui parametri della chiamata e sui valori ritornati dalla chiamata stessa. L'indirizzo http e naturalmente l'indirizzo del web server a cui fa capo il service, in questo esempio si tratta di un web server locale, come vedremo piu avanti.

Notiamo ancora che nel nostro esempio semplicemente scriviamo già la chiamata alla funzione del web service che ci interessa:

reply = client.convertieuro(15000)

Questo possiamo farlo perche naturalmente conosciamo con precisione il nome della funzione, i parametri ed il valore ritornato. Ma e perfettamente realizzabile una chiamata dinamica che recupera ognuna di queste informazioni dal WSDL, e quindi usa sempre le informazioni di chiamata fresche fornite dal web server: pensiamo alla utilità di questo quando si cambiano i parametri, i nomi delle funzioni, ecc. I clients possono essere resi trasparenti a questi cambiamenti.

A questo punto il nostro client VB e pronto: compiliamo e salviamo.

Sperimentare il web service in locale

Per sperimentare il nostro web service in ambiente locale dobbiamo attivare un web server sul nostro computer, e configurarlo per richiamare l'ActiveX Esempio.dll quando un client richiede il servizio.

Ci riferiamo quindi al modo in cui va configurato il web server IIS, incluso in Windows 2000 od XP. Come primo passo naturalmente bisogna installare IIS.

Apriamo quindi il pannello di controllo, e poi Installazione applicazioni. Selezioniamo la voce Installazione componenti di Windows: se la voce Internet Information Services (IIS) ha già il check allora IIS e già installato, altrimenti mettiamo il check e clicchiamo Avanti per proseguire. Verrà richiesto il CD di Windows, e verrà installato IIS .

La directory di default per il nostro web server IIS e:

c:\inetpub\wwwroot

Creiamo sotto essa una directory SoapTest per il web service:

c:\inetpub\wwwroot\SoapTest

Dentro essa copiamo i files SoapTest.WSDL, SoapTest.WSML e SoapTest.ASP.

Apriamo ancora il pannello di controllo, clicchiamo sull'icona Strumenti di amministrazione, poi sull'icona Internet Information Services.

Nella finestra di gestione di IIS, nella voce Sito web predefinito, vediamo la nostra directory. Facciamo click destro e scegliamo la voce di menu Nuovo/Directory virtuale…. Selezioniamo Sito web predefinito. Clicchiamo Avanti, selezioniamo come nome virtsoaptest, poi mettiamo come directory del contenuto: c:\inetpub\wwwroot\SoapService. Andiamo avanti, lasciamo le opzioni di lettura ed esecuzione ASP, e completiamo la procedura guidata. Adesso abbiamo definito sotto IIS l'indirizzo http a cui corrisponde il web service:

http://localhost/virtsoaptest/soaptest.asp

Come ultima cosa, avviamo IIS: selezioniamo Sito web predefinito e clicchiamo sulla icona con la freccia nera, avvia (oppure dal menu Azione/Avvia).

Possiamo finalmente sperimentare il nostro web service! Apriamo ancora l'ambiente VB, carichiamo il progetto txsoap, eseguiamolo. Clicchiamo il pulsante SOAP nel form, se tutto funziona come deve apparirà un msbox con il messaggio:

ConvertiEuro(15000) = 7.7468

Sperimentare il web service su Internet

Finora abbiamo provato il nostro Web service sul nostro stesso PC. Ma si puo fare di piu! E' possibile usare un sito Internet che e in grado di fare da client generico per un qualunque Web service. Questo dimostra anche la potenza dello standard: un computer remoto, di cui non sappiamo nulla (sistema operativo, web server, linguaggio di programmazione..), e che nulla sa di noi, colloquia con il nostro server, riceve le informazioni formattate nel WSDL, esegue la chiamata e visualizza i risultati: incredibile! Specialmente in confronto ad altri standard molto piu complessi da mettere in funzione, come CORBA.

Come prima cosa, dobbiamo abilitare l'accesso al nostro web service da un client anonimo.

Nel pannello di controllo di IIS selezioniamo la directory VIRTSOAPTEST e clicchiamo con il tasto destro del mouse. Scegliamo Proprietà dal menu, e poi il tab Protezione directory, clicchiamo il pulsante Modifica. Nella pagina visualizzata abilitiamo il check Accesso anonimo, e confermiamo ciccando su OK. Poi riavviamo IIS: selezioniamo Sito web predefinito e clicchiamo sulla icona con la freccia nera, avvia (oppure dal menu Azione/Avvia).

Colleghiamoci ad Internet con il nostro provider. Fatto questo, troviamo l'indirizzo IP assegnato al nostro computer: apriamo una finestra DOS e digitiamo IPCONFIG <INVIO>.

Leggiamo l'indirizzo IP della corrispondente alla connessione Internet (in questo caso corrisponde a Scheda PPP), poi apriamo con un editor (come Notepad) il file SoapTest.WSDL. Dobbiamo scrivere l'indirizzo IP al posto di localhost nella riga seguente (e la riga da cui il client legge proprio l'indirizzo a cui chiamare il web service):

<soap:address location='http://localhost/virtsoaptest/SoapTest.ASP'/>

va modificato così:

<soap:address location='http://213.213.32.198/virtsoaptest/SoapTest.ASP'/>

dove il numero in grassetto e proprio l'indirizzo IP. Salviamo SoapTest.WSDL .

Apriamo Internet Explorer, e digitiamo l'indirizzo:

http://www.soapclient.com/

Si tratta di un sito con molte informazioni e link a vari web services, ma in particolare con un client per SOAP generico, che puo chiamare qualunque web service, anche il nostro! Funziona semplicemente leggendo il file di descrizione WSDL, che contiene tutte le informazioni che servono.

Clicchiamo quindi sul link Generic Soap Client.

Si apre una pagina dove viene richiesto l'indirizzo HTTP del file WSDL, scriviamo quindi l'indirizzo che già conosciamo, e poi clicchiamo su Retrieve. (Attenzione! Va scritto il nome del file con estensione WSDL, non quello con estensione ASP).

A questo punto viene caricata la pagina del risultato della chiamata al web service (nella pagina precedente si puo scegliere se si vuole vedere il risultato come XML o come HTML, abbiamo scelto quest'ultima possibilità).

Nella risposta si vede:

Conclusione

Questo semplice esempio ci ha fatto vedere come la tecnologia dei web services e realmente un potente strumento di comunicazione tra computers diversi, e di creazione di applicazioni distribuite. L'uso del Microsoft SOAP toolkit da parte sua rende estremamente semplice e lineare l'uso dei web services anche con un tool di sviluppo popolare e diffuso come Visual Basic 6.

Giandomenico De Sanctis

Riferimenti di documentazione

Mail contact