17

Sep

Windows 8: Richiesta Http e gestione di una risposta compressa

Ciao a tutti,

in questo posto voglio farvi vedere come gestire una richiesta Http con WinRT, come le nuove API ci facilitano di molto la vita e anche come gestire una risposta compressa in formato GZip tramite l’utilizzo del namespace System.IO.Compression.

Come prima cosa creiamo la nostra richiesta in questo modo:

   1: async void GetRequest(Uri uri){
   2: HttpClient httpClient = new HttpClient();
   3:  
   4: //creaiamo il messaggio di richiesta
   5: HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, uri);
   6: //aggiungiamo eventuali headers in questo modo
   7:  
   8: //message.Headers.Add("string_key", object_value );
   9:  
  10: //settiamo che la nostra richiesta può 
  11: //ricevere messaggi in formato gzip
  12: message.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
  13:  

Perfetto, abbiamo creato la nostra richiesta, adesso eseguiamola!

   1: //inviamo la richiesta utilizzando la fantastica keywork await :)
   2: var response = await client.SendAsync(message);

grazie alla keyword await l’esecuzione della richiesta verrà eseguita in maniera asincrona, ma tutto il codice che viene posto dopo verrà in automatico eseguito una volta che la richiesta è stata completata!

P.s. Il pattern Async/Await è una delle nuove meraviglie del nuovo Framework, il nostro codice risulta molto più leggibile(senza gestioni di callback ecc…) e  abbiamo rispariamo tante righe di codice Sorriso! Cosa vogliamo di più?!

Qui trovate la documentazione su MSDN.

Bene adesso non ci resta che gestire la risposta. Naturalmente questo esempio è a scopo dimostrativo e non vengono prese in considerazioni eventuali eccezioni o errori di rete! Quindi sicuramente DEVE essere completato prima di essere utilizzato in una applicazione reale.

   1: //controllo che la richiesta è andata a buon fine
   2: if (response.StatusCode == HttpStatusCode.OK)
   3:    {
   4:     string respToString;
   5:     //controllo se la risposta è in formato gzip
   6:     if (!response.Content.Headers.ContentEncoding.Contains("gzip"))
   7:         //non è in formato gzip quindi trasformo la risposta in stringa
   8:          respToString = await response.Content.ReadAsStringAsync();
   9:     else
  10:            {
  11: //E' in formato gzip, allora utilizzo il nuovo GZipStrem che fa parte del namespace System.IO.Compression
  12: //passandogli lo stream della risposta e, in questo caso, settiamo il CompressionMode su Decompress
  13: var gZipStream = new GZipStream(await response.Content.ReadAsStreamAsync(),
  14:                                 CompressionMode.Decompress);
  15: //una volta decompressa la risposta non ci resta che recuperare la stringa ed utilizzarla secondo i nostri scopi
  16:   respToString = gZipStream.ToTextString();
  17: }
  18: }
  19: }

 

Cosa dire: Fantastico! Grazie al nuovo framework, con poche righe di codice, abbiamo creato una richiesta HTTP, eseguita e gestito una risposta sia normale che in formato gzip! Il tutto, grazie alle nuove keyword async/await, che ci hanno facilitato di molto il compito evitandoci di gestire callback ed eventi! Sorriso

Per provare, vi basterà copiare ed incollare i tre snippet di codice e la funzione è già pronto all’uso!

Grazie a tutti e alla prossima

Carmine

by Carmine Punella on 9/17/2012
Post archive