Web

Un micro client HTTP nella uPLibrary !

Non mi fermo mai ed anche ora che sono in ferie continuo a …. programmare !

Questa volta tocca alla mia uPLibrary che ho aggiornato alla versione 2.0 (ovviamente anche su Nuget con il supporto a ben tre versioni del .Net Micro Framework, dalla 4.1 all’attuale 4.3) con un nuovo componente : un client HTTP.

Tutti vi starete facendo delle domande sul perché della necessità di riscrivere un client HTTP considerando che esistono le già ampiamente collaudate classi HttpWebRequest edHttpWebResponse direttamente incluse nel .Net Micro Framework. Ebbene, in alcune board con poca memoria (vedi Netduino), gli assembly relativi a queste due classi occupano troppo spazio e lavorando con degli stream sono poco performanti. Per questo motivo, ho deciso di realizzare un semplice client (ogni consiglio per il suo miglioramento è ben accetto) che sfrutta direttamente le socket senza alcuno strato intermedio di astrazione (concetto che molte volte nei sistemi embedded bisogna limitare per migliorare le performance).

Il modello di programmazione è abbastanza semplice, in quanto prevede l’uso della classeHttpClient che mette a disposizione i tre seguenti metodi principali :

  • Send() : per eseguire una generica richiesta HTTP (GET, POST, PUT, …);
  • Get() : metodo ad hoc per eseguire richieste di tipo GET;
  • Post() : metodo ad hoc per eseguire richieste di tipo POST;

Il metodo Send() riceve in ingresso un oggetto di tipo HttpRequest nel quale vanno specificati tutti i dati che compongono la richiesta (metodo HTTP, URI di destinazione ed eventuali headers). Esso ritorna un oggetto di tipo HttpResponse con tutte le informazioni sulla risposta ricevuta dal server. Per poter gestire la ricezione di un body (nel caso di GET) o l’invio (nel caso di POST o PUT), è possibile utilizzare i seguenti due eventi che la classe espone :

  • RecvBody : sollevato nel momento in cui ci sono dati nel body in ricezione e possono essere acquisiti;
  • SendBody : sollevato dal client solo nel caso in cui c’è un event handler registrato, che sancisce la volontà di voler trasferire dei dati al client attraverso il body;

In caso di ricezione, l’event handler riceve in ingresso l’oggetto HttpResponse attraverso il quale poter accedere alla proprietà Body su cui invocare il metodo Read(), che legge i dati direttamente dalla socket restituendoli in un buffer da noi specificato. L’evento viene sollevato più volte fino al completamento del body.

In caso di invio, l’event handler riceve in ingresso l’oggetto HttpRequest attraverso il quale poter accedere sempre alla proprietà Body su cui invoare il metodo Write() al quale poter passare un buffer con i dati da scrivere sulla socket sottostante. Questo evento viene sollevato una sola volta dal client, per cui è necessario effettuare al suo interno eventualmente più chiamate su Body.Write() fino alla completa trasmissione del body desiderato.

Di seguito è riportato un banalissimo esempio per ricevere la pagina del sito Microsoft.

public static void Main()
{
    HttpRequest req = new HttpRequest();
    req.Method = HttpMethod.Get;
    req.Uri = new Uri("http://www.microsoft.com");
    req.Headers.Add("Accept", "text/html");

    HttpClient client = new HttpClient();
    client.RecvBody += client_RecvBody;
    client.Send(req);
}

static void client_RecvBody(HttpResponse httpResp)
{
    byte[] buffer = new byte[1024];
    int read = httpResp.Body.Read(buffer, 0, 1024);
    Debug.Print(new String(Encoding.UTF8.GetChars(buffer)));
}
I metodi Get() e Post() sono banalmente due wrapper del metodo Send() che servono solo a semplificare le operazioni più comunemente eseguite, appunto GET e POST. Entrambe ricevono l’URI verso il quale effettuare la richiesta (senza la necessità di “riempire e passare” un oggetto HttpRequest , lo faranno loro per noi) e l’event handler per eseguire la ricezione del body (in caso di GET) o l’invio (in caso di POST).

Riprendendo l’esempio precedente, attraverso il metodo Get() avremmo il seguente codice.

public static void Main()
{
    HttpClient client = new HttpClient();
    client.Get("http://www.microsoft.com", client_RecvBody);
}

Nel caso di collegamento ad un servizio REST al quale dover trasmettere dei dati, possiamo pensare ad un utilizzo di questo tipo.

public static void Main()
{
    HttpClient client = new HttpClient();
    client.Post("http://myserver/api/", client_SendBody);
}

static void client_SendBody(HttpRequest httpReq)
{
    byte[] buffer = Encoding.UTF8.GetBytes("");
    httpReq.ContentLength = buffer.Length;
    httpReq.Body.Write(buffer, 0, httpReq.ContentLength);
}
Advertisements

ioProgrammo : Netduino robot in movimento con il Kinect e la “nuvola” di Google…

8321.4-185g_2B485CEB

Questo mese su “ioProgrammo” (n. 185, Maggio/Giugno 2013) ci sono due miei articoli notevolmente diversi nei contenuti e nelle tecnologie utilizzate.

Il primo articolo è completamente dedicato alla demo di una sessione che ho tenuto con Clemente Giorio alla Microsoft Embedded Conference 2013 che ho organizzato con la community di cui faccio parte, il DotNetCampania, e che si è tenuta a Napoli nel mese di Gennaio. Obiettivo dell’articolo è la realizzazione di un robot basato sulla board Netduino Plus e .Net Micro Framework che è possibile pilotare attraverso il Kinect, facendo uso di comandi vocali e gestures.

Il secondo articolo, pur essendo un “Microsoftiano” convinto, è dedicato alla tecnologia Cloud del concorrente Google. Vedremo infatti come muovere i primi passi nell’ambito del Google App Engine, dallo sviluppo con Eclipse al deploy in pochi semplici passaggi. Ovviamente, non mancherò in futuro di scrivere un articolo sulla controparte di casa Microsoft, Windows Azure !

Come sempre, non mi stancherò mai di dirlo, non perdetevelo !

ioProgrammo : Una stazione meteo con il Netduino

3404.4-184g_4BF915F1

Questo mese su “ioProgrammo” (n. 184, Marzo/Aprile 2013) c’è un mio articolo dedicato alla realizzazione di una stazione meteo con il Netduino Plus.

Utilizzando il .Net Micro Framework e la board Netduino Plus, vediamo passo per passo come realizzare una stazione meteo che ci permetta di rilevare temperatura, umidità, luminosità e velocità del vento, tenendo tutto sotto controllo attraverso il Web, mediante un web server integrato ed un “mini-sito” onboard.

La mia raccomandazione di sempre…non perdetevelo !

ioProgrammo : Accesso al file system attraverso il browser

7563.4-183g_561A3CAE

Questo mese su “ioProgrammo” (n. 183, Febbraio 2013) c’è un mio articolo dedicato all’accesso al file system dal browser.

Grazie al nuovo standard HTML5, le nostre applicazioni Web hanno la possibilità di gestire un file system “sandboxed” sul PC del client utilizzando numerose e potenti funzioni.

La mia raccomandazione di sempre…non perdetevelo !

ioProgrammo : Multithreading in JavaScript con i Web Workers

1106.4-182g_372D7A20

Questo mese su “ioProgrammo” (n. 182, Gennaio 2013) c’è un mio articolo dedicato al multithreading in JavaScript mediante l’uso dei Web Workers.

Si parte dell’analisi del modello di runtime del codice JavaScript, tipicamente singlethreaded, e degli eventi per poi introdurre le funzionalità e l’API dei Web Workers che sono stati aggiunti attraverso lo standard HTML5.

La mia raccomandazione di sempre…non perdetevelo !

ioProgrammo : Internet of Things con Netduino e Web “real time” con SignalR !

4426.4-181g_0E484465

Questo mese su “ioProgrammo” (n. 181 Dicembre 2012) ci sono addirittura due mie articoli dedicati rispettivamente all’Internet Of Things e SignalR.

Nel primo, viene affrontata l’analisi dell’Internet Of Things, un neologismo che si basa sulla condivisione e lo scambio attraverso la rete Internet delle informazioni provenienti dai più svariati sistemi embedded nel mondo, tutto attraverso un’applicazione pratica con Netduino.

Nel secondo, vengono analizzate le principali tecniche utilizzate per la realizzazione di applicazioni Web “real-time”, dalla teoria ad un’applicazione pratica che fa uso della libreria open source SignalR.

La mia raccomandazione di sempre…non perdetevelo !