REST e Linq: transformando queries Linq em URI’s

Há poucos dias Rafael Godinho e eu realizamos um WebCast sobre REST e aplicações RESTful (você pode encontrar o WebCast aqui: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032410135&culture=pt-BR ).

Uma das coisas que acredito que deixamos de chamar a atenção neste WebCast foi sobre o uso do Linq e de chamadas assíncronas no Silverlight com o ADO.Net Data Services.

Primeiro, para quem não sabe, o ADO.Net Data Services é uma tecnologia que oferece interfaces REST para serem acessadas por agentes externos – isto é, interfaces clientes ou outros sistemas externos. As interfaces exposta são interfaces CRUD utilizando os verbos do http (GET, PUT, etc.) onde a uri, no caso de um read, pode ter expressões de filtragem (ex.: http://.../Livros()?$filter=(novo eq true) ). É importante também saber que o ADO.Net Data Services expõe entidades que podem vir de um Entity Framework (com quase nenhum esforço) ou de entidades em memória (estes últimos, com um pequeno esforço).

Quando um serviço REST é exposto pelo ADO.Net Data Services o cliente Silverlight pode usar a API do System.Data.Services.Client para acessar o serviço REST remoto. Para isto, ele cria um contexto indicando a uri raiz dos serviços a serem chamados e , com ele, pode realizar queries Linq como se estivesse junto ao Banco de Dados local.

Os aspectos que não chamamos a atenção no WebCast são:

  1. o comando Linq realizado no cliente cria uma uri que inclui a condição de filtro. Portanto, a filtragem já é feita no servidor. Temos, por assim dizer, um LinqToUri !! A alternativa de trazer toda a coleção para o cliente e lá usar a condição de filtro na coleção retornada não seria aceitável, pois incorreria num custo alto de rede;
  2. num cliente, como o Silverlight, é importante utilizar a chamada REST de forma assíncrona. A penalidade no caso de não fazer isto é ter a thread do cliente parada à espera da resposta, levando insatisfação ao usuário. O System.Data.Services.Client oferece esta possibilidade com a simples indicação de uma callback.

É muito simples e creio que vale uma olhada nestas tecnologias. Sugiro também o artigo do John Papa sobre o assunto: http://msdn.microsoft.com/en-us/magazine/dd569758.aspx.

Abraços