ASP.NET Core - Apresentando e usando OData - II


Neste artigo vamos apresentar o recurso OData e como podemos usá-lo em aplicações ASP .NET Core para criar Web API Restful com recurso de consultas e filtro flexíveis.

Continuando a primeira parte do artigo veremos como implementar o OData em nossa API criada no artigo anterior.

A idéia é alterar o mínimo possível o código existente de forma não termos que reescrever nossa API.

Implementando o OData

Abrindo o projeto criado na primeira parte do artigo vamos incluir o pacote Nuget para habilitar o OData em nosso projeto e assim definir consultas mais flexíveis.

Acesse o menu Tools -> Manage Nuget Package For Solutions;

Selecione Browse e localize e instale o pacote : Microsoft.AspNetCore.OData

A seguir abra o arquivo Startup e no  método ConfigureServices registrar o serviço OData() via injeção de dependência:

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            var connection = @"Data Source=Macoratti;Initial Catalog=EstudoDataBase;Integrated Security=True";
            services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connection));
            services.AddOData();
        }

A seguir precisamos definir quais as convenções vamos permitir para criar as consultas customizadas que desejamos realizar em nossa API de forma a poder usar a API já pronta sem ter que alterar nada no seu código.

No método Configure vamos habilitar a injeção de dependência para suportar rotas HTTP e a seguir definir quais opções de consultas desejamos habilitar em nossas rotas.

No exemplo estamos habilitando as opções de consulta:  Expand(), Select(), Count(), OrderBy() e Filter().

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseMvc(routeBuilder =>
            {
                routeBuilder.EnableDependencyInjection();
                routeBuilder.Expand().Select().Count().OrderBy().Filter();
            });
        }

Para concluir vamos incluir em cada controlador o atributo [EnableQuery]

[EnableQuery]
[Route("api/[controller]")]
[ApiController]

public class AlunosController : ControllerBase
{
    ....
}
[EnableQuery]
[Route("api/[controller]")]
[ApiController]

public class EscolasController : ControllerBase
{
    ....
}

O atributo [EnableQuery] permite que os clientes modifiquem a consulta usando opções de consulta, como $Filter, $Select e $Expand, etc.  (Na verdade poderíamos definir o atributo apenas no método HttpGet)

Pronto. Agora podemos executar novamente o projeto e definir consultas flexíveis usando as opções de consulta definidas no método Configure.

Para testar podemos usar o Postman mas como somente estamos fazendo consultas podemos ver o resultado no Browser também.

Para simplificar vou usar o navegador Chrome. Executando o projeto e testando as consultas teremos o resultado a seguir:

1- Selecionar apenas os nomes e notas dos alunos

https://localhost:4430/api/alunos?$Select=Nome,Nota

2- Selecionar apenas os nomes e notas dos alunos e ordernar por nome

https://localhost:4430/api/alunos?$Select=Nome,Nota&$OrderBy=Nome

3- Selecionar apenas os nomes e notas dos alunos com nota menor que 7

https://localhost:4430/api/alunos?$Select=Nome,Nota&$Filter=Nota lt 7

4- Selecionar apenas os nomes e notas dos alunos com nota maior ou igual a 7

https://localhost:4430/api/alunos?$Select=Nome,Nota&$Filter=Nota ge 7

5- Selecionar apenas os nomes e notas dos alunos com nota igual a 8

https://localhost:4430/api/alunos?$Select=Nome,Nota&$Filter=Nota eq 8

Observe que usamos a interrogação (?) para separar os parâmetros da consulta, o caractere (&) para concatenar mais as opções de consulta e que cada opção de consulta é precedida de um caractere $.

Temos assim a implementação de consultas mais flexíveis com filtro, ordenação, etc, em nossa API REst usando os recursos do OData e sem ter que alterar muito o nosso código já existente.

Para realizar operações CRUD teríamos que fazer outras alterações que mostrarei em outro artigo.

Pegue o projeto usado no exemplo aqui:  Api_OData1.zip

"Porque há um só Deus, e um só Mediador entre Deus e os homens, Jesus Cristo homem."
1 Timóteo 2:5


 

 

Referências:


José Carlos Macoratti