Accedere ai dati su rete in Universal App


Questo articolo è tratto dal libro Sviluppare Universal App per Windows e Windows Phone - Con XAML e C# di Daniele Bochicchio, Cristian Civera, Marco De Sanctis, Alessio Leoncini, Marco Leoncini e Stefano Mostarda.

Acquista subito la tua copia ad un prezzo vantaggioso!

[...]

Nel precedente capitolo abbiamo visto come sfruttare le potenzialità della programmazione multithreading in Windows 8. In questo capitolo cambiamo completamente argomento e parliamo di come accedere ai dati tramite rete nelle applicazioni WinRT.

Qualunque applicazione interagisce con dei dati che, in genere, sono residenti su un database o su un file. Questa impostazione ha fatto sì che negli anni le applicazioni fossero sviluppate partendo dal concetto che i dati sono residenti su un database al quale l'applicazione accede direttamente. Con lo sviluppo di Internet, si è resa sempre più viva la necessità di rendere disponibili all'esterno i dati del database, così che potessero essere consumati anche da applicazioni di terze parti (basti pensare alla possibilità di esporre tramite feed RSS i post di un blog).

Per standardizzare la distribuzione dei dati sono nati standard come SOAP e RSS, mentre altri sono diventati di moda, come nel caso di JSON. Grazie a questi protocolli di comunicazione standard, la condivisione dei dati è divenuta molto semplice anche tra piattaforme tecnologicamente eterogenee.

Questo comporta il fatto che le nostre applicazioni non accedono più direttamente a un database ma a dei servizi in rete (sia essa Internet o una rete locale) che espongono i dati del database. Le applicazioni WinRT portano questo paradigma all'estremo, non integrando alcun meccanismo nativo per accedere a database ma permettendo di accedere ai dati solo tramite rete.

Nota

Il team di SQLite (il più diffuso motore di database locale) ha creato una versione di SQLite ad-hoc per WinRT, così che possiamo avere un motore di database locale da usare quando l'accesso ai dati tramite la sola rete sia troppo oneroso o non disponibile. Parleremo di SQLite per WinRT nel prossimo capitolo.

Accedere ai dati via rete è completamente diverso dall'accedere a un database. Per recuperare i dati da un database usiamo i provider ADO.NET presenti nel .NET Framework, che rendono la programmazione univoca astraendo la complessità di ogni singolo database, mentre per recuperare i dati via rete, possiamo avere diversi protocolli di comunicazione (TCP, HTTP, WebSocket) e diversi formati di serializzazione (HTML, JSON, RSS, XML).

In questo capitolo ci occuperemo di vedere come recuperare i dati via rete, sfruttando i protocolli e i formati appena menzionati, così che alla fine saremo in grado di recuperare i dati per la nostra applicazione in qualunque modo.

Cominciamo col vedere come possiamo recuperare dati dalla rete sfruttando i diversi protocolli messi a disposizione.

Trasmettere dati tramite la rete

Come detto nell'introduzione del capitolo, per rete non si intende solo il web, ma anche una semplice rete aziendale. Questo significa che per recuperare e manipolare dati abbiamo a disposizione non solo il protocollo HTTP (tipico delle applicazioni web), ma anche altri protocolli come TCP e WebSocket (in realtà esiste anche il protocollo UDP che però non tratteremo in questa sezione perché di raro utilizzo). Vediamo ora come sfruttare ognuno di questi protocolli, sia per recuperare dati per la nostra applicazione sia per inviarli al server, partendo dal protocollo HTTP.

Scambiare dati con il protocollo HTTP

Il protocollo HTTP è l'ideale per applicazioni che si basano sullo scambio di messaggi, poiché prevede un semplice pattern di richiesta/risposta. Il client richiede una risorsa al server (un'immagine, un file, una stringa e così via) e il server risponde con la risorsa (o con un messaggio di errore, nel caso la risorsa non sia disponibile o ci sia un errore nel recuperarla). Questo flusso di comunicazione è visualizzato nella figura.

Da sempre il .NET Framework contiene classi che permettono di eseguire richieste HTTP a un server remoto e di recuperarne la risposta. Tuttavia, WinRT ha introdotto una nuova classe: HttpClient, che semplifica notevolmente sia il recupero sia l'invio di dati da e verso un server remoto.

Nella prossima sezione vedremo come recuperare i dati tramite questa classe.

Recuperare dati dal server

La classe HttpClient, situata nel namespace Windows.Web.Http, permette di recuperare dati da un server remoto tramite HTTP con una quantità minima di codice. Un modello delle poche righe di codice necessarie a svolgere questo compito è mostrato nell'esempio 18.1 in cuiviene recuperato il codice HTML di una pagina web.

Esempio 18.1 - C#
try
{
  var client = new HttpClient();
  var uri = new Uri("http://localhost/");
  string html = await client.GetStringAsync(uri); 
  //processa html
}
  catch (HttpRequestException ex)
{
  //Codice di gestione errore
}

Come si evince dal codice, la prima cosa da fare è istanziare la classe HttpClient e successivamente utilizzare il metodo GetStringAsync, passando in input l'url da invocare, per recuperare la stringa HTML dal server remoto. La stringa che viene recuperata non deve corrispondere ad alcun formato e quindi può essere codice HTML piuttosto che una stringa JSON o un frammento di XML o altro ancora. Il formato della stringa è qualcosa di completamente trasparente al metodo GetStringAsync e sarà compito della nostra applicazione interpretare la stringa per processarne il contenuto (vedremo nel prosieguo del capitolo come trattare i diversi formati della stringa ottenuta dal server).

Il metodo GetStringAsync è ottimale quando dobbiamo recuperare una stringa, ma non è efficace quando dobbiamo recuperare altri tipi di dati, come immagini, video, file, e così via. In questi casi dobbiamo utilizzare i metodi GetBufferAsync e GetInputStreamAsync. Il primo metodo conviene quando abbiamo a che fare con risorse di piccole dimensioni mentre il secondo è comodo quando dobbiamo scaricare una grande mole di dati. Nel prossimo esempio possiamo vedere come sfruttare il metodo GetBufferAsync per scaricare un'immagine.

Esempio 18.2 - C#
try {
  HttpClient client = new HttpClient();
  var uri = new Uri("http://localhost/img.png");
  object img = await client.GetBufferAsync(uri);
  //processa img salvando il file
  var file = await 
  ApplicationData.Current.LocalFolder.CreateFileAsync("img.png");
  await FileIO.WriteBufferAsync(file, img);
} 
catch (HttpRequestException ex) {
  //Codice di gestione errore
}

Il codice dell'esempio 18.2 è molto simile a quello nell'esempio 18.1. In questo caso mostriamo anche come salvare il buffer in un file usando la classe FileIO.

Finora abbiamo visto come recuperare dati da un server remoto. Tuttavia possiamo fare anche l'inverso, ossia inviare dati al server cosicché quest'ultimo sia in grado di processarli ed eventualmente salvarli sul proprio database. Vediamo nella prossima sezione come inviare dati al server.

4 pagine in totale: 1 2 3 4
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Top Ten Articoli

Articoli via e-mail

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

In primo piano

I più letti di oggi

In evidenza

Misc