JSON for Dummies (parte 3)

In questo terzo post della serie JSON for Dummies (qui la parte 1 e la parte 2) vedremo una implementazione più elegante del processo di deserializzazione di dati JSON provenienti da un servizio REST.

Creeremo una funzione asincrona generica che si occupi di connettersi al servizio remoto, scaricare i dati e deserializzarli nel tipo corretto. La prima modifica è che useremo il metodo GetAsync() di HttpClient invece del metodo GetStringAsync(). In questo modo avremo una risposta del tipo HttpResponseMessage  che espone proprietà utili a stabilire l’esito della connessione. In questa prima implementazione Controlleremo che lo StatusCode della risposta sia positivo prima di continuare. In caso contrario lanceremo una eccezione. Dopo aver verificato l’esito positivo dell’operazione possiamo deserializzare il contenuto della risposta con ReadAsStringAsync().

public async Task<T> GetAsync<T> (Uri uri)
{
    using (var http = new HttpClient())
    {
         http.DefaultRequestHeaders.Add("Accept", "application/json");
         var response = await http.GetAsync(uri);
         if (response.StatusCode != System.Net.HttpStatusCode.OK)
         throw new Exception(response.StatusCode.ToString());
         string json = await response.Content.ReadAsStringAsync();
         return JsonConvert.DeserializeObject<T>(json);
    }
}

Grazie all’uso di HttpResponseMessage  possiamo rendere ulteriormente compatto il codice sostituendo il controllo dell’esito della richiesta  (tutta la struttura dell’if) con

response.EnsureSuccessStatusCode();

dato che il metodo EnsureSuccessStatusCode() restituisce l’HttpResponseMessage in caso di esito positivo, la nostra funzione finale può essere scritta in questo modo:

public static async Task<T> GetAsync<T> (Uri uri)
{
using (var http = new HttpClient())
{
http.DefaultRequestHeaders.Add(“Accept”, “application/json”);
var response = await http.GetAsync(uri);
string json = await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(json);
}
}

In questo modo basterà richiamare la funzione appena definita sostituendo T con il tipo di oggetto da deserializzare e uri con la url del servizio

MyStruct struct = await GetAsyncAuthenticated<MyStruct>(uri);

Nel prossimo episodio vedremo come connettersi a servizi REST autenticati.

Annunci

Un pensiero su “JSON for Dummies (parte 3)

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...