[EVENTO] #TunodeYoxaml #YonodeTuxaml

Este fin de semana tuvo lugar en Santa Pola el supereventazo #TunodeYoxaml #YonodeTuxaml en el que tuve el placer de poder participar y el que me acompañaron desde Madrid 3 amiguetes @gulnor @panicoenlaxbox y @Chkduke (@achamorroman se nos cayó en el último momento) y que tengo que darles las gracias porque me lo he pasado genial y por el regalito geek!!!

En la foto de inferior los 4 magníficos con @XaviPaper después del evento en el bar (No todo es programar)

BI9zQmrCUAAEv3e

Me gustaría dar las gracias publicamente a los organizadores y patrocinadores por hacer realidad el evento, por lo que hemos aprendido (16 ponencias de todo tipo), por habernos tratado tan bien, por el buen ambiente que hubo durante todo el fin de semana, por la buena organización, por las cervezas… de verdad muchas gracias, habéis dejado el listón muy pero que muy alto!!!

Comenté que para mi presentación me había basado en un libro gratuito y muy interesante, que tan solo tiene 38 páginas:

Web API Design – Crafting Interfaces that Developers Love

Un saludo.

PD: ¿Cuando tendrémos disponibles el vídeo del cierre del evento a cargo de @_pedrohurtado? XD

[ASP.NET WebAPI] Como recibir tipos complejos en nuestros controladores por URL

Actualmente, me encuentro desarrollando una API, me he encontrado con que en  algunos controladores, mejor dicho, en los métodos o acciones de estos controladores necesito recibir un tipo complejos, algo como esto:

public JObject GetProductsByTag(string tag, QueryStringRequestCommand requestCommand)

Este tipo complejo tiene básicamente las siguientes propiedades:

public class QueryStringRequestCommand
{
    [Minimum(1)]
    public int PageIndex { get; set; }
    [Minimum(1)]
    [Maximun(50)]
    public int PageSize { get; set; }
    public string Sort { get; set; }
} 

¿Para que uso este tipo complejo?

Pues para agrupar los valores que me vienen del QueryString y no tener un controlador con muchos parámetros y poder validarlos con atributos (DataAnnotations), así pues cuando se llame al controlador de productos:

/api/products/tagged/harinas?sort=newest&pageIndex=1&pageSize=20

se deserialize en un objeto del tipo QueryStringRequestCommand, pero!!! si pruebas este código tal cual lo he puesto, te darás cuenta que dicho parámetro vendrá a null:

image

Esto es debido a que al tratarse de un tipo complejo, WebAPI intentará deserializar la información con un media type formatter, que por defecto miran en el cuerpo de la petición y en nuestro caso está vacío porque esta información viene en la Url.

¿Pero como le digo a mi controlador como deserializar esta información?

Pues de una manera muy sencilla, basta con decorar el parámetro con este atributo FromUri para que utilize el model binder

public JObject GetProductsByTag(string tag, [FromUri] QueryStringRequestCommand requestCommand)

Probamos de nuevo y funciona!!!

image

¿A partir de ahora en todos métodos de mi controlador tengo que añadir el atributo FromUri?

Esa es una muy buena pregunta y la respuesta es NO.

Para ello vamos a hacer buen uso de la extensibilidad de WebAPI y para ello lo primero es crear una interfaz vacía que nos sirva de contrato:

public interface IRequestCommand
{
}

En nuestro tipo complejo la implementamos

public class QueryStringRequestCommand : IRequestCommand
{
    [Minimum(1)]
    public int PageIndex { get; set; }
    [Minimum(1)]
    [Maximun(50)]
    public int PageSize { get; set; }
    public string Sort { get; set; }
}

Y por último, vamos a añadir una regla a la colección de reglas ParameterBindingRules de la configuración (HttpConfiguration) para que sepa como hacer bind de nuestro tipo complejo:

config.ParameterBindingRules.Insert(
    0,
    descriptor => typeof(IRequestCommand).IsAssignableFrom(descriptor.ParameterType) ?
        new FromUriAttribute().GetBinding(descriptor) : null);

Cuando el tipo complejo que recibimos en la petición, sea asignable a nuestra interfaz IRequestCommand, que en el caso de QueryStringRequestCommand lo es porque implementa esta interfaz usará una instancia del atributo FromUri y así nos evitamos tener que estar decorando todos muestro métodos con este atributo (DRY).

image

Un saludo y espero que os haya gustado.

[Fiddler] Scratchpad es tu aliado

Si eres un enamorado de Fiddler (Sino lo conoces ya estas tardando en descargarlo e instarlo) como yo y te pasas el día lanzando llamadas a tu API REST y esas llamadas son muy repetitivas, te recomiendo que uses Scratchpad.

¿Que es Scratchpad?

Es una opción que viene por defecto en Fiddler que nos permite mantener una lista de nuestras llamadas HTTP.

¿Como funciona?

En la tab de Composer (Básicamente nos permite crear nuestras Request HTTP) creamos nuestra Request, en este ejemplo estoy llamando a WebAPI para que me devuelva un listado ordenado y paginado de preguntas:

image

Ejecutamos la Request, pinchamos en la pestaña de Scratchpad y arrastramos la respuesta:

image

A partir de ahora y aunque cerremos Fiddler, tendremos nuestra petición lista para lanzarla las veces que queramos con tan solo seleccionarla y ejecutarla:

image

Buen fin de semana a todos!!!