JSON for Dummies (parte 4)

Dopo aver visto come connetterci ad un servizio REST con HttpClient (vedi la parte 3) concludiamo l’argomento illustrando come connetterci ad un servizio REST autenticato e come eseguire altre operazioni che non siano solo il semplice GET.

Tutto quello che dobbiamo fare è semplicemente usare il costruttore dell’HttpClient che prende un oggetto HttpClientHandler come parametro e impostare la proprietà Credential di quest’ultimo uguale ad un oggetto NetworkCredential che possiamo passare alla nostra funzione

 NetworkCredential credential = new NetworkCredential(username, password); 

L’ultima cosa da modificare è DefaultRequestHeaders dell’HttpClient, e a questo punto la funzione che permette di fare una chiamata Get autenticata può essere scritta in questo modo:

  
public static async Task<T> GetAsyncAuthenticated<T>Uri uri, NetworkCredential credential) 
{
     using (var http = new HttpClient(new HttpClientHandler { Credentials = credential }))     
     {         
          http.DefaultRequestHeaders.Add"Accept", "application/json");
          http.DefaultRequestHeaders.Add("user-Agent", "authentication.cs");
          var response = await http.GetAsync(uri);
          string json = await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync();
          var output = JsonConvert.DeserializeObject<T>(json);
          return output;
     } 
} 

In modo assolutamente analogo possiamo scrivere una funzione che esegua un POST autenticato (o non autenticato, basta rimuovere le parti relative all’autenticazione), dove ovviamente dobbiamo passare anche un content da passare al POST

 
public static async Task<T> PostAsyncAuthenticated<T>(Uri uri, NetworkCredential credential, HttpContent content)
{ 	
     using (var http = new HttpClient(new HttpClientHandler { Credentials = credential }))
     {                 
          http.DefaultRequestHeaders.Add("Accept", "application/json");
          http.DefaultRequestHeaders.Add"user-Agent", "authentication.cs");
          var response = await http.PostAsync(uri, content);                 
          string json = await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync();                 
          return JsonConvert.DeserializeObject<T>(json); 	
     } 
} 

Come vedete usando HttpClient è tutto molto semplice. Buon lavoro!

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.