ASP.NET Core - Consumindo uma Minimal API - I


 Hoje veremos um exemplo básico de como consumir uma minimal API em uma aplicação ASP .NET Core MVC.

Neste tutorial iremos criar uma aplicação ASP .NET Core Web API usando a abordagem das minimal APIs que vai expor um serviço com frases de pensamentos que estarão registrados em um repositório.

A seguir vamos criar uma aplicação ASP .NET Core MVC que vai acessar e consumir a Minimal API e vai exibir o pensamento na página web.

Tudo bem simples.

Criando a solução

Vamos criar uma solução em branco usando o template Blank Solution com o nome DicasApp

Criando a Minimal API

A seguir vamos incluir um projeto Web API nesta solução usando o template ASP.NET Core Web API com o nome DicasApp.Api

A seguir vamos definir as configurações conforme mostra a figura:

Observe não marcarmos a opção para usar Controllers e assim vamos criar uma minimal API.

Neste projeto vamos criar uma pasta Models e nesta pasta criar a classe Pensamento :

public class Pensamento
{
    public string? Nome { get; set; }
    public string? Texto { get; set; }
    public string? Categoria { get; set; }
}

Esta classe representa o nosso domínio.

Vamos agora criar na classe Program um Repositório onde vamos criar uma lista de pensamentos e a seguir criar um endpoint para obter de forma aleatória um pensamento deste repositório.

using DicasApp.Api.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapGet("/dicas", () =>
{
    Random rand = new Random();
    int toSkip = rand.Next(0, 10);
    Pensamento pensamento = Repository().Skip(toSkip).Take(1).FirstOrDefault();
    return pensamento;
})
.WithName("GetDicas");

app.Run();

List<Pensamento> Repository()
{
    List<Pensamento>? listaPensamentos = new List<Pensamento> {
                new Pensamento {Nome = "Desconhecido", Texto = "Não é necessário melhorar a aparência, adquirir muita cultura, aumentar o salto do sapato, levantar mais o nariz.  Precisamos diminuir o barulho,caminhar mais devagar, prestar atenção a quem chega, abaixar a cabeça e colocar a humildade pra funcionar. Somos grandes, quando somos pequenos.", Categoria="Reflexão" },
                new Pensamento {Nome = "Dalai Lama", Texto = "Nunca estrague o seu presente por um passado que não tem futuro.", Categoria="Reflexão" },
                new Pensamento {Nome = "C.S.Lewis", Texto = "Existem coisas melhores adiante do que qualquer outra que deixamos para trás.", Categoria="Pensamentos" },
                new Pensamento {Nome = "C.S.Lewis", Texto = "Pensava que nós seguíamos caminhos já feitos, mas parece que não os há. O nosso ir faz o caminho.", Categoria="Pensamentos" },
                new Pensamento {Nome = "Calvino", Texto = "A natureza do homem, por assim dizer, é uma fábrica perpétua de ídolos.", Categoria="Meditação" },
                new Pensamento {Nome = "J.Wesley", Texto = "Deus é o gerador e causador de todo bem que está no homem ou é praticado por ele.", Categoria="Evangelho" },
                new Pensamento {Nome = "C.R.Sproul", Texto = "O único tipo de Deus que podemos amar por meio de nossa natureza pecaminosa é um deus profano, um ídolo feito por nossas próprias mãos.", Categoria="Reflexão" },
                new Pensamento {Nome = "Spurgeon", Texto = "A glória da Onipotência é atuar mediante improbabilidades.", Categoria="Meditação" },
                new Pensamento {Nome = "C.R.Sproul", Texto = "Saber que Deus sabe tudo sobre mim e, ainda assim me ama é, de fato, meu consolo definitivo.", Categoria="Meditação" },
                new Pensamento {Nome = "Spurgeon", Texto = "Aqueles que mergulham no mar das aflições trazem pérolas raras para cima.", Categoria="Meditação" }
                };

    return listaPensamentos;
}

Aqui temos o código do Repository que cria uma lista de objetos do tipo Pensamento que expressa o pensamento do dia que iremos exibir no web site.

Poderíamos ter implementando o acesso a uma base de dados onde essas informações estariam armazenadas mas isso é um detalhe que você pode expandir.

O código do endpoint  GET /pensamentos é bem simples:

app.MapGet("/pensamentos", () =>
{
    Random rand = new Random();
    int toSkip = rand.Next(0, 10);
    Pensamento pensamento = Repository().Skip(toSkip).Take(1).FirstOrDefault();
    return pensamento;
})
.WithName("GetDicas");

Nele estamos obtendo a partir do repositório de forma aleatória um item da lista e retornando para o consumidor do recurso.

Este código define um endpoint GET que pode ser acessado através da rota "/pensamentos". Quando um cliente faz uma solicitação GET para essa rota, o aplicativo executará a função de retorno de chamada definida, que é um lambda que:

  1. Cria uma nova instância da classe Random para gerar um número aleatório.
  2. Usa o número aleatório para definir o número de itens a serem ignorados no conjunto de dados retornado pelo método Repository() e o número de itens a serem retornados (no caso, apenas um item).
  3. Chama o método Skip() para ignorar o número de itens definidos acima e o método Take() para retornar o número de itens desejados (neste caso, apenas um item).
  4. Retorna o primeiro item encontrado, ou null se nenhum item for encontrado, usando o método FirstOrDefault() da coleção resultante.
  5. Finalmente, o método WithName() é chamado para dar um nome ao endpoint, que neste caso é "GetDicas".

Executando este projeto teremos o seguinte:

Acionando endpoint teremos o resultado esperado:

E nossa API esta pronta para ser consumida.

Na próxima parte deste artigo iremos criar a aplicação MVC para consumir esta API.

"O Senhor estabeleceu o seu trono nos céus, e como rei domina sobre tudo o que existe."
Salmos 103:19

Referências:


José Carlos Macoratti