ASP.NETJavaScriptJQueryMVC

WebApi & oData Queries

· por Marc Rubiño

Hace unos días Scott Guthrie nos anunció en su blog el lanzamiento de la versión Release de las ASP.NET and Web Tools 2012.2 update disponible para Visual Studio 2012 y .Net framework 4.5

Una de las mejoras que más me ha gustado es el soporte de WebApi al estándar oData, este soporte otorga a nuestro servicio REST la potestad de generar Url’s con consultas semánticas, paginado, operaciones CRUD, etc .

Configuración inicial

Para empezar a jugar con esta poderosa opción primero tenemos que tener el ejemplo base listo:

    // GET api/values
    public IEnumerable Get()
    {
        return _pedidos.ListaPedidos();
    }

datos

Tree

    config.EnableQuerySupport();
    public IQueryable Get()
    {
        return _pedidos.ListaPedidos().AsQueryable();
    }

«api/values?$orderby=Total asc»

Especificación oData

Los parámetros que podemos utilizar en nuestra URL para realizar las consultas son:

Más información sobre la convención de las URL en oData en  http://www.odata.org/media/30002/OData%20URL%20Conventions.html#url2

El Ejemplo

Ahora que ya tenemos el servicio preparado para recibir las queries prepararemos un cliente sencillo para consumir y probar la potencia de las queries con oData.

Tendremos una web que realiza una llamada AJAX utilizando JQuery para facilitar las cosas.

  function cargar(filtro) {
        $.getJSON(filtro, null, function (data) {
            var fact = $("#facturas");
            fact.html("");
            $.each(data, function (index, obj) {
                var fecha = new Date(obj.Fecha);
                fact.append("</pre>
<ul>
	<li>Factura: " + obj.Id + " " + fecha.toDateString() + " Total : " + obj.Total + "</li>
</ul>
<pre>");
            });
        });
    }

Esta función recibe la consulta a pasar al servicio y rellena una lista con el resultado obtenido de la llamada AJAX.

Ahora la podemos utilizar por ejemplo para consultar:

cargar("api/values?$skip=0&$top=5&$orderby=Total desc");

top5

cargar("api/values?$filter=Poblacion eq 'Barcelona'");
cargar("api/values?$filter=day(Fecha) eq 12");
cargar("api/values?$filter=length(Id) eq 5");
cargar("api/values?$filter=Total ge 1000 and Total le 2000");

Conclusión

Creo que para los servicios de datos es muy interesante la potencia que nos otorga la posibilidad de personalizar las consultas en el lado del cliente, pero siempre que tengamos claros los límites y tener muy bien definidos las políticas de seguridad.

Con estos cuatro ejemplos creo que queda muy claro toda la potencia y el amplio abanico de posibilidades que se nos presentan para trabajar con servicios REST de una manera mucho más ágil. Si creéis que este tema es interesante podría hacer un par de entradas más sobre paginación,  validación y seguridad entre otras opciones.