Cos'è un Web service?
Un servizio Web, in inglese Web service, è un'applicazione a cui si può accedere attraverso il web, cioè attraverso internet. La caratteristica fondamentale del Web service è la sua interfaccia verso la rete. Questa interfaccia deve essere standard, cioè deve poter essere compresa da una qualunque applicazione che vuole fare uso del servizio, e che, quindi, deve essere in grado di comunicare con esso.
Un'applicazione che usa un Web service viene detta applicazione che "consuma" il Web service.
La maggior parte dei Web service, per assicurare la massima interoperabilità con le altre applicazioni web, potenziali consumatrici del servizio, usa degli standard che sono:
- il linguaggio XML, usato per scambiare i messaggi;
- il protocollo HTTP usato per trasportare i messaggi attraverso la rete internet;
- il WSDL che è un formato automaticamente elaborabile, con cui si descrive l'interfaccia software del Web service.
Con ASP.NET è possibile usare un Web service invocandolo come un normale oggetto, grazie ad un meccanismo di classi che fanno da "intermediarie": le classi proxy. In particolare il VWD genera dinamicamente le classi proxy, basandosi sul documento WSDL.
L'esempio
Cerchiamo di capire come "consumare" un Web service con un semplice esempio ed andiamo su un sito che offre vari servizi Web.
Scegliamo il servizio Web Stock Quote cliccandoci sopra.
Ci appare una descrizione del servizio e la locazione dello schema WSDL.
Prendiamo la locazione: http://www.webservicex.net/stockquote.asmx?WSDL
ed apriamola nel browser.
Se nel nostro progetto non c'è ancora una cartella App_Code
, creiamola e salviamoci dentro il file visualizzato nel browser, contenente lo schema WSDL del servizio Web, con estensione .wsdl
. Per il nostro esempio, salviamo il file in App_Code
con nome stockquote.wsdl
.
Finalmente possiamo creare la pagina che fruisce del servizio, una pagina in cui possiamo inserire il simbolo del titolo azionario che ci interessa in una TextBox
, e che, dopo aver cliccato su un Button
, restituisca la quotazione in una Label
. Un esempio è il seguente:
La pagina è molto semplice e dobbiamo solo gestire l'evento del click sul bottone. Con un doppio click passiamo alla parte codice interno ed implementiamo il metodo btnOttieniQuotazione_Click
. Dobbiamo istanziare un oggetto della classe StockQuote
, quindi digitiamo sto
. Notiamo che l'intellisense del VWD riconosce il comando e ci propone il nome della classe StockQuote
.
Possiamo quindi affermare che la classe proxy è stata generata dinamicamente. Utilizzando l'intellisense andiamo avanti nell'implementazione dell'esempio. Il codice completo del metodo per ottenere la quotazione è il seguente:
Listato 1. btnOttieniQuotazione_Click
protected void btnOttieniQuotazione_Click(object sender, EventArgs e)
{
StockQuote ws = new StockQuote();
lblQuotazione.Text = ws.GetQuote(tbSimbolo.Text);
}
Salviamo e testiamo la nostra applicazione.
Mettiamo ad esempio il simbolo GE della General Electric e premiamo il pulsante. Otteniamo:
Nella quotazione che ci ritorna abbiamo molte informazioni che possiamo naturalmente parsare. Possiamo notare da sinistra verso destra: il simbolo, l'ultima quotazione, la data della quotazione, l'ora etc. Per completezza riportiamo lo schema a cui possiamo attingere per parsare la stringa:
Listato 2. Stringa in formato XML
<StockQuotes>
<Stock>
<Symbol>GE</Symbol>
<Last>34.33</Last>
<Date>5/26/2006</Date>
<Time>4:00pm</Time>
<Change>-0.09</Change>
<Open>34.47</Open>
<High>34.53</High>
<Low>34.10</Low>
<Volume>21190100</Volume>
<MktCap>357.0B</MktCap>
<PreviousClose>34.42</PreviousClose>
<PercentageChange>-0.26%</PercentageChange>
<AnnRange>32.21 - 37.13</AnnRange>
<Earns>1.579</Earns>
<P-E>21.80</P-E>
<Name>GEN ELECTRIC CO</Name>
</Stock>
</StockQuotes>
Se avessimo voluto consumare il servizio Web senza generare dinamicamente la classe proxy avremmo dovuto aggiungere una Web Reference
al nostro progetto, quindi inserire l'URL del servizio e poi istanziare un oggetto con l'istruzione:
net.webservicex.www.StockQuote ws = new net.webservicex.www.StockQuote();
In definitiva il nostro metodo sarebbe stato:
Listato 3. Metodo senza generazione dinamica della classe proxy
protected void btnGetQuote_Click(object sender, EventArgs e)
{
net.webservicex.www.StockQuote ws = new net.webservicex.www.StockQuote();
lblStockQuote.Text = ws.GetQuote(tbCompanySymbol.Text);
}
Il sorgente dell'esempio sviluppato in questo articolo può essere scaricato da qui.