ASP .NET Core 6 - Criando Minimal APIs - I
Hoje veremos o novo recurso para criação de Minimal APIs disponível a partir do .NET 6.0 para projetos ASP .NET Core 6. |
O novo recurso do .NET 6.0 - Minimal APIs - para a ASP .NET Core 6 permite, criar APIs com o mínimo de dependência do framework WebAPI e o mínimo de código e arquivos necessários para o desenvolvimento minimalista de APIs.
Agora a ASP .NET Core segue outras tecnologias como GO, Python e Node.js que já permitiam a criação de APIs com o mínimo de código e dependências.
Como principais objetivos as Minimals APIs da plataforma .NET permitem :
Não há nenhum template ASP.NET Core específico para construir uma API mínima, para isso você pode simplesmente usar o template “ASP.NET Core Empty” para criar seu projeto no VS 2022:
Ou emitir o comando : dotnet new web -o MinApi na ferramenta de linha de comando .NET CLI.
Criando o projeto no VS 2022, a seguir basta informar o nome do projeto :
Selecionar o Framework .NET 6.0 (que atualmente esta em RC1) e clicar em Create :
E a solução será criada com a seguinte estrutura :
Observe que temos apenas o arquivo appsettings.json e o arquivo Program e a pasta Properties.
Abrindo o arquivo Program temos um código simplificado usando o recurso do Top Level Statements do C# 9.0.
Na verdade podemos simplificar ainda mais o código
criando uma API com apenas 3 linhas de código:
var a = WebApplication.Create(args); |
A inicialização ficou mais simples graças ao novo tipo - Microsoft.AspNetCore.Builder.WebApplication - cujo objetivo é configurar de forma simples e objetiva um aplicativo web, e podemos usar este recursos para fazer quase tudo que você precisa para uma Web API : configuração de acesso, configurar o contêiner de injeção de dependência, configurar o pipeline do aplicativo registrando componentes de middleware e para iniciar o ouvinte HTTP.
Assim, WebApplication unifica os recursos de IApplicationBuilder, IHost e IEndpointRouteBuilder ao mesmo tempo e, junto com seus próprios recursos, tem acesso a todos os métodos de extensão integrados e de terceiros para essas interfaces.
Graças às instruções de nível
superior, podemos executar um programa sem usar uma declaração de namespace,
uma declaração de classe ou mesmo um método Main(string []
args). Só com isso temos uma economia de nove linhas de código. Mesmo sem o método
Main, ainda podemos inferir argumentos - o
compilador cuida disso para você.
Observe que não existem declarações using, e, isso
ocorre porque, por padrão no .NET 6, o ASP.NET Core esta usando o novo recurso
do Global Usings - uma nova maneira de declarar
seus usings em um único arquivo, evitando a necessidade de declará-los em
arquivos de origem individuais.
O uso do recurso Global Using do C# 10, permite que os usings sejam controlados por meio do MSBuild do projeto SDK e o usings implícitos para o projeto Web SDK são:
System.Net.Http.Json
Microsoft.AspNetCore.Builder
Microsoft.AspNetCore.Hosting
Microsoft.AspNetCore.Http
Microsoft.AspNetCore.Routing
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Logging
|
Assim todos os namespaces abaixo não precisam ser importados manualmente e código pode usá-los de forma implícita:
System System.Collections.Generic System.IO System.Linq System.Net.Http System.Threading System.Threading.Tasks |
Se examinarmos o arquivo de projeto MinApi.csproj teremos o seguinte:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
|
No arquivo de projeto vemos a propriedade ImplicitUsings definida como enable e assim as diretivas Global Usings são adicionadas. (A partir das próximas versões este recurso não será implicitamente ativado para evitar problemas de compatibilidade com versões anteriores)
O código também usa os métodos de extensão auxiliares Map{verb} para configurar os endpoints. Este recurso estava presente no .NET 5, mas agora eles dão suporte ao model binding, a integração com a injeção de dependência e acessam facilmente os dados da rota, o que torna a sua utilização mais completa.
Além disso o uso dos novos recursos das expressões lambdas no C# 10 que agora podem:
Resolvem muitos problemas encontrados anteriormente no uso das expressões lambdas para definir endpoints em uma API HTTP e permite simplificar bastante o código.
Executando o projeto teremos o resultado abaixo:
O arquivo Startup.cs
desapareceu, apenas o arquivo Program.cs e os
arquivos appsettings.json permanecem.
Assim temos que as APIs mínimas são uma mistura simplificada entre:
- Recursos do Top Level Statements do C# 9;
- O recurso Route-to-code disponível a partir da
ASP.NET Core 3;
- E onde a configuração do aplicativo ASP.NET Core foi movida do arquivo
Startup.cs para o arquivo
Program.cs;
Esta é uma API .NET totalmente desenvolvida, sem DI, sem objetos de configuração e tudo em um único arquivo.
E isso fornece um ponto de partida muito mais leve para qualquer API que precise fazer apenas uma coisa, e é este realmente o objetivo dessas APIs : simplicidade e objetividade.
Naturalmente, podemos adicionar terminais adicionais, adicionar lógica, retornar tipos complexos (que serão convertidos para JSON como é padrão).
Veremos a seguir como incluir alguns recursos no projeto MinApi criado no VS 2022.
Habilitando o Swagger
A título de exemplo vamos incluir habilitar o Swagger nesta API incluindo no projeto uma referência ao pacote : Swashbuckle.AspNetCore
A seguir vamos alterar o código do arquivo Program para:
Executando novamente o projeto e navegando para o endpoint /swagger teremos:
Trabalhando com Models
Vamos agora usar outro novo recurso disponível com C# 9.0 , o recurso Record.
Com apenas uma linha de código adicional, podemos trabalhar com um Record de Cliente. Lembrando que Record são tipos de referência que usam igualdade baseada em valor e ajudam a impor a imutabilidade. Com parâmetros posicionais, você pode declarar um modelo em apenas uma linha de código.
Executando o projeto e acionando o endpoint /swagger teremos:
Usando HttpClient
Agora veremos como usar o recurso HttpClient para consumir APIs por conta própria.
Como exemplo vamos usar o JSONPlaceholder que é um serviço REST on-line gratuito que você pode usar sempre que precisar de alguns dados para exibir em suas aplicações. É ótimo para ser usado em tutoriais e simula um servidor, compartilhando exemplos de código.
Você pode simular requisições HTTP com GET, POST, PUT e DELETE e não precisa registro.
Assim vamos usar o HttpClient para acessar os dados do serviço REST em https://jsonplaceholder.typicode.com/ no formato JSON.
Temos os seguintes recursos disponíveis :
Eu vou acessar o endpoint albums.
Vamos alterar o código no arquivo Program para:
Executando o projeto e acionando o endpoint /swagger teremos o resultado:
Na outra parte do artigo veremos como usar outros recursos nas APIs mínimas.
Pegue o projeto exemplo aqui: MinApi.zip (sem as referências)
"Bendito o Deus e Pai de nosso Senhor
Jesus Cristo, o qual nos abençoou com todas as bênçãos espirituais nos lugares
celestiais em Cristo; Como também nos elegeu nele antes da fundação do
mundo, para que fôssemos santos e irrepreensíveis diante dele em amor;"
Efésios 1:3,4
Referências:
C# - Lendo e escrevendo em arquivos textos e binários
C# - Entendo o I/O na plataforma .NET
C# - Fluxo assíncrono ou async streams
C#- Apresentando Streams assíncronos
NET 6 - Global Using : Usando o modificador global na diretiva using