tesinanicola_giancecchi_tesina (699294 byte)

Connessione e fruizione di
Web Services su Windows Phone
Nicola Giancecchi
[email protected]
m. 0000653628
Programmazione di Sistemi Mobile a.a. 2014/2015
Università di Bologna, C.d.L. in Ingegneria e Scienze Informatiche
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
Introduzione
Oggigiorno la maggior parte delle applicazioni in esecuzione tutte le piattaforme si connette ad Internet
per la fruizione di contenuti ospitati su server e database remoti.
Per accedere a dati dinamici, che cambiano con frequenza nel tempo, non vengono effettuate connessioni
dirette ai database perchè porterebbero ai seguenti svantaggi:
-
maggiore stress del database e traffico generato su di esso
-
minore possibilità di caching dei dati
-
necessità di utilizzo di software e librerie per l’accesso al database -- non essendo presente
un’interfaccia standard di comunicazione tra il client (che può essere eseguito su diversi OS) e il
server.
Si tende perciò ad utilizzare i cosiddetti ​
web services​
, servizi in esecuzione sul server che si interpongono
tra il dispositivo dell’utente e la fonte dati. Un webservice si occupa di richiedere dati ad una fonte dati
interna o esterna e restituirli all’utente su protocollo HTTP in un formato standard - tipicamente JSON o
XML - adatto a tutti i sistemi operativi.
Per accedere a dati “statici” quali foto, video e file ospitati su server si utilizzano, invece, chiamate HTTP
direttamente sui file interessati.
L’esempio
Nell’esempio che vedremo in questo tutorial andremo a costruire una semplice applicazione per Windows
Phone che permetterà, dato in input un simbolo di un titolo finanziario quotato in Borsa, di ricevere la sua
attuale quotazione. Useremo come servizio le ottime API fornite da Yahoo! Finance
(​
http://finance.yahoo.com​
).
2
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
Prepariamo lo spazio di lavoro
Per iniziare, creiamo un nuovo progetto in Visual Studio 2013. Scegliamo la tipologia “Visual C#” >
“Windows Phone” e dalla lista di template disponibili scegliamo “Windows Phone App”. Diamo un nome al
progetto e clicchiamo su OK.
Ci si aprirà la schermata principale dell’ambiente di sviluppo. Per prima cosa creiamo la classe che gestirà
le chiamate al web service.
Andiamo nell’area a destra, nel “Solution Explorer”, facciamo click col tasto destro sul nome della
soluzione e scegliamo “Add” > “New Item”. Dalla lista degli item disponibili, scegliamo l’elemento “Class”.
Rinominiamo il file in “Webservice.cs” e facciamo click su “Add”.
Nella classe appena creata andiamo a dichiarare una costante stringa di nome BASE_URL: essa sarà l’URL
di partenza per comporre le chiamate al Webservice. Prendendo ad esempio come titolo MSFT (Microsoft
Corporation), l’URL finale sarà:
http://finance.yahoo.com/webservice/v1/symbols/MSFT/quote?format=json&view=detail
L’URL base che useremo è ​
http://finance.yahoo.com/webservice/v1/symbols/​
.
Creiamo anche due costanti stringa che ci potranno essere utili più avanti, le chiamiamo GET e POST e il
contenuto sarà, appunto, “GET” e “POST”. Questi saranno i due tipi di metodi HTTP che potremo usare al
termine del tutorial.
Get started: core
Iniziamo a progettare e a creare la nostra classe Webservice. Vogliamo creare una classe il più versatile
possibile, che possa cioè adattarsi ai più svariati utilizzi. Possiamo quindi pensarla componendola di:
-
un core privato contenente tutta la logica della connessione
3
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
-
API pubbliche, richiamabili dal codice, che eseguono chiamate al core.
Andiamo quindi a creare il core della nostra classe, la cui interfaccia sarà:
Ogni chiamata che farà riferimento a ​
Webservice.MakeNetworkOperation​
dovrà passare come parametri
il metodo HTTP (​
GET​
o​
POST​
), la path (percorso relativo all’URL base definito in precedenza),
eventualmente parametri, e possiederà anche una callback di completamento e una di errore.
Iniziamo a popolare il nostro core:
Per gestire la connessione utilizzeremo la classe HttpWebMethod messa a disposizione da Microsoft nel
package System.Net. Creiamo l’oggetto passando l’URL e impostiamo il metodo HTTP.
Ora, per supportare sia le chiamate GET che le chiamate POST, abbiamo bisogno di “dividere le strade”,
poichè la chiamata POST ha bisogno di un ulteriore passaggio - quello della scrittura del buffer per l’invio
della Request HTTP. Perciò:
Se il metodo è GET, chiamo la funzione ​
BeginGetResponse ​
(che verrà spiegata più avanti) passando
l’oggetto HttpWebRequest e le due callback. Altrimenti:
Dopodichè inizio il Request Stream. Notare che:
-
la AsyncCallback viene eseguita inline, senza chiamare altri metodi.
-
la tecnica per comporre i parametri è la stessa della chiamata GET; questa volta però i dati
saranno trasformati in byte poichè dovranno far parte del Request Stream.
4
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
A questo punto le strade si ricongiungono e chiamo il metodo BeginGetResponse come nella chiamata
GET:
Analizziamo quindi il metodo ​
BeginGetResponse ​
che si occuperà di ricevere la response dal server:
5
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
Creiamo una API che sfrutta il core
Wait, we need Json.net!
Prima di iniziare a scrivere la nostra prima API è necessario scaricare ​
Json.net​
, una libreria che si occupa
di serializzazione, deserializzazione e gestione di contenuti JSON. Per installarla è consigliabile usare
nuget​
, package manager di Microsoft che permette di installare librerie e pacchetti con una riga di codice.
Rechiamoci quindi nel menù “Tools” > “Extensions and Updates” e, nella sezione “Online”, assicuriamoci
che “NuGet Package Manager for Visual Studio 2013” sia installato. Se non lo è, cliccare sul tasto “Install
Now” e seguire la procedura guidata.
Una volta installato nuget è possibile scaricare Json.net all’interno del nostro progetto. Rechiamoci in
“Tools” > “Library Package Manager” > “Package Manager Console”. Aspettiamo che la console si avvii,
quindi digitiamo il comando per scaricare Json.net. Tale comando si può facilmente trovare con una
ricerca sul sito ​
www.nuget.org​
, contenente la repository di tutti i componenti. Per Json.net la stringa di
installazione è: ​
Install-Package Newtonsoft.Json​
. DIgitare poi Invio per avviare il download.
Includiamo poi la libreria appena scaricata aggiungendo le seguenti ​
using ​
al file Webservice.cs:
6
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
Ok, ci siamo.
Ora siamo pronti per utilizzare il nostro metodo ​
MakeNetworkOperation​
.
L’URL di esempio che abbiamo visto,
http://finance.yahoo.com/webservice/v1/symbols/MSFT/quote?format=json&view=detail​
,
restituisce una risposta in formato JSON. Notiamo anche che, rispetto all’URL base, essa è posizionata
all’endpoint ​
MSFT/quote​
e possiede due parametri GET: ​
format ​
e​
view​
.
Scriviamo un nuovo metodo statico chiamato ​
SearchStockSymbol ​
che riceve in input il simbolo richiesto
dall’utente:
Andiamo quindi a comporre i parametri del metodo ​
MakeNetworkOperation​
. Abbiamo bisogno della path
(ovvero dell’endpoint) e dei due parametri visti prima:
Eseguiamo quindi la nostra operation:
I dati che ci interessano (simbolo, nome dell’azienda e quotazione) sono racchiusi all’interno dell’oggetto
“​
fields​
” che ha come​ key path list -> resources -> [0] -> resource -> fields​
. Per sicurezza
perciò controlliamo che​list->resources​
sia valorizzato e abbia almeno un elemento e che l’oggetto
7
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
fields sia valorizzato. In caso affermativo deserializziamo i dati tramite Json.net e li restituiamo nella
callback, altrimenti la callback tornerà ​
null ​
(errore generico).
Colleghiamo l’interfaccia.
Finalmente abbiamo tutto il necessario per realizzare la
nostra app!
Apriamo quindi il file ​
MainPage.xaml​
che rappresenta la
home page della nostra app. Tramite la toolbox presente in
basso a sinistra in Visual Studio, aggiungiamo alla nostra
interfaccia:
-
una TextBox che conterrà la query di ricerca
dell’utente (​
txtSymbolName​
)
un Button per inviare la richiesta al server
(​
btnSendToServer​
)
due TextBlock - ​
lblStockName​
per visualizzare il
nome dell’azienda e ​
lblStockPrice​
per visualizzare
la quotazione.
Clicchiamo due volte sul Button per associarci l’evento
btnSendToServer_Click ​
che verrà creato all’interno del file
MainPage.xaml.cs​
.
Nel metodo appena creato andremo a chiamare il nostro
webservice tramite l’API appena realizzata. Passiamo all’API il
contenuto della TextBlock tramite la proprietà Text.
Il codice gestisce due casi:
-
result != null​
: in questo caso ho una risposta valida, perciò inserirò i valori desiderati nelle due
TextBlock
8
Connessione e fruizione di Web Services su Windows Phone - Nicola Giancecchi
-
result==null​
: in questo caso è avvenuto un errore oppure il simbolo non è valido, mostro quindi
un messaggio di errore nella TextBlock.
Notiamo inoltre che viene utilizzato ​
Dispatcher.BeginInvoke()​
: infatti la chiamata al webservice è
asincrona e viene effettuata in un thread separato. Grazie a questa istruzione possiamo “tornare” al main
thread per modificare gli elementi dell’interfaccia.
Premiamo il tasto Play per testare la nostra app sull’emulatore o su un dispositivo reale:
9