[WEB API]Usando el HttpResponseMessage

Una de las muchas ventajas que nos ofrece el WEB Api es el poder trabajar con los cuerpos de las respuestas http de una manera muy natural, esto lo logramos haciendo uso de la clase HttpResponseMessage que nos ofrece una completa suite de elementos para lograr respuestas claras y precisas.

Pero, ¿qué quiere decir es esto?… pues veámoslo en un ejemplo.

Teniendo una clase Persona como la siguiente:

    public class Persona
    {
        public int Id { getset; }
        public string Nombre { getset; }
    }

Y en nuestro PersonaController tenemos el siguiente código:

    public class PersonasController : ApiController
    {
        private static readonly List<Persona> Personas = CrearPersonas();

        private static List<Persona> CrearPersonas()
        {
            var personas = new List<Persona>();
            personas.Add(new Persona { Id = 1, Nombre = "Nicolas" });
            personas.Add(new Persona { Id = 2, Nombre = "Santiago" });
            return personas;
        }

        public List<Persona> Get()
        {
            return Personas;
        }

        public Persona Get(int id)
        {
            var persona = Personas.FirstOrDefault(x => x.Id == id);
            return persona;
        }
    }

Al consumir nuestra Api con la siguiente peticion dese un cualquier cliente obtendríamos las siguientes respuestas:

Pero, ¿qué pasa si preguntamos por un recurso que no existe? Se verá como lo siguiente:

Fijémonos que nuestra api nos está retornando un 200 (OK) pese a que claramente ese recurso no existe!! ¿Pero entonces como solucionamos este problema?

HttpResponseMessage Al rescate:

El uso de HttpResponseMessage es bastante sencillo y nos va a salvar de este lio, simplemente redefinimos nuestro método de la siguiente manera:

        public HttpResponseMessage<Persona> Get(int id)
        {
            var persona = Personas.FirstOrDefault(x => x.Id == id);
            if (persona == null)
            {
                var mensaje404 = new HttpResponseMessage<Persona>(HttpStatusCode.NotFound);
                return mensaje404;
            }
            var personaMensaje = new HttpResponseMessage<Persona>(persona);
            return personaMensaje;
        }

Si consumimos ahora nuestra Api y preguntamos por un recurso que no existe, veremos algo como lo siguiente:

Como vemos su uso es bastante sencillo, simplemente hacemos uso de la clase genérica definiéndola del tipo de nuestra clase, y empleando dos sobrecargas del constructor, una con el resultado en el Content-type que nos piden (json-xml) y la otra haciendo uso del enumerador HttpStatusCode
para retornar el código adecuado.

Un ejemplo adicional es con el verbo Post usado para agregar un nuevo recurso y obtener un 201, además podemos informar de la ubicación del recurso una vez se ha agregado. Podemos definir entonces este método en nuestro controlador de la siguiente forma:

        public HttpResponseMessage<Persona> Post(Persona nuevaPersona)
        {
            nuevaPersona.Id = Personas.Count + 1;
            Personas.Add(nuevaPersona);
            var personaMensaje = new HttpResponseMessage<Persona>(nuevaPersona, HttpStatusCode.Created);
            personaMensaje.Headers.Location = new Uri(Request.RequestUri,
                                                      string.Format("api/personas/{0}", nuevaPersona.Id));
            return personaMensaje;
        }

Y al consumirlo desde un cliente con la siguiente petición:

Tendremos una respuesta como la siguiente:

Espero les sea de utilidad.

Hasta el próximo post.

Anuncios
[WEB API]Usando el HttpResponseMessage

7 comentarios en “[WEB API]Usando el HttpResponseMessage

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s