Sunday, April 6, 2014

Creando clientes WebApi con HttpClient en Vs2010

Con la aparición del .net framework 4.5 y la versión 5 del lenguaje C#, surgió la clase HttpClient. Esta clase fue especialmente creada para manejar todo tipo de request sobre http. Podemos utilizar esta clase en VS2010 si hemos instalado MVC4 (http://www.asp.net/mvc/mvc4). En esta entrada, crearemos un cliente para nuestro servicio WebAPI utilizando la clase HttpClient.



Primero, agregaremos un nuevo proyecto de tipo consola a la solución existente que creamos en la entrada anterior.



Daremos click derecho sobre las referencias del nuevo proyecto y presionaremos "Add reference". En explore, buscaremos la siguiente ruta: "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Net.Http.dll".



También necesitaremos descarganos el paquete Json .NET. Para ello, necesitaremos tener instalado el NuGet package manager (http://www.nuget.org/). Una vez instalado, daremos click derecho sobre las referencias del proyecto y seleccionaremos "Manage Nuget Packages..."



En la pantalla que aparece a continuación, buscaremos Json .NET y lo instalaremos.



A continuación, dejo el código de la clase cliente con comentarios en cada una de las líneas que explicarán el funcionamiento de la misma.

using System;
using System.Net.Http;
using Newtonsoft.Json;

namespace WebApiBlogClient
{
    class Program
    {
        // constante con la URL base de nuestro servicio REST
        private const string urlBase = "http://localhost:52750/api/Valores";

        static void Main(string[] args)
        {
            // creamos una instancia de httpClient
            var client = new HttpClient();

            // hacemos una llamada de tipo "GET" asíncrona
            client.GetAsync(urlBase).ContinueWith((continueTask) =>
            {
                // ContinueWith se ejecuta cuando la llamada GET termina

                // Obtenemos la respuesta
                var response = continueTask.Result;

                // Si el status code es distinto de Success, 
                // lanzaremos una excepción
                response.EnsureSuccessStatusCode();

                // Leemos la respuesta de forma asíncrona también
                response.Content.ReadAsStringAsync().ContinueWith(readTask =>
                {

                    // Tenemos un string leído asíncronamente en readTask.Result
                    var json = readTask.Result;

                    // Lo convertimos en un array Json utilizando JSON .NET 
                    // en este caso, un array de strings
                    var array = JsonConvert.DeserializeObject<string[]>(json);

                    int i = 0;

                    foreach (var valor in array)
                    {
                        // Imprimimos los valores recibidos
                        Console.WriteLine(i++ + ": " + valor);
                    }

                });
            });

            // Esperamos a que se presione alguna tecla 
            Console.WriteLine("Presiona cualquier tecla para terminar...");
            Console.ReadLine();

        }
    }
}

El resultado al ejecutar la aplicación entonces es el siguiente:



Importante! así como hemos usado el método GetAsync de HttpClient, esta clase contiene métodos PostAsync, PutAsync y DeleteAsync, cada uno de los cuales se corresponde con un método HTTP. Al ser asíncronos sin embargo, notamos como no se ejecuta el código dentro del bloque "ContinueWith..." hasta que la llamada asíncrona haya terminado. Es por eso que los valores recibidos se escriben después de la línea "Presione cualquier tecla para terminar...". Deberemos entonces, tener en cuenta esto al momento de elaborar nuestro código, si este depende de la respuesta recibida por el método Async que hayamos invocado.




No comments:

Post a Comment