ASP .NET Core - Consumindo uma Web API com React - II
Neste artigo vamos continuar criando a Web API ASP .NET Core para depois consumi-la usando uma aplicação React. |
Continuando o artigo anterior vamos agora criar o serviço e o controlador para gerenciar informações dos alunos.
Criando um serviço para alunos
Vamos agora iniciar a criação dos serviços e para fazer isso poderíamos apenas criar uma classe concreta e definir nela os serviços que vamos usar e a seguir registrar esta classe no contêiner de injeção de dependência, mas a forma mais correta é primeiro definir uma interface e a seguir implementar essa interface na classe concreta e é isso que vamos fazer.
Vamos criar na pasta Services uma interface chamada AlunoService e a seguir vamos definir o seguinte código:
using AlunosApi.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace AlunosApi.Services
{
public interface IAlunoService
{
Task<IEnumerable<Aluno>> GetAlunos();
Task<Aluno> GetAluno(int id);
Task<IEnumerable<Aluno>> GetAlunoByNome(string nome);
Task CreateAluno(Aluno aluno);
Task UpdateAluno(Aluno aluno);
Task DeleteAluno(Aluno aluno);
}
}
|
A seguir vamos criar na mesma pasta a classe AlunosService onde vamos definir implementar esta interface e definir os métodos para acessar e persistir os dados dos alunos no SQL Server usando uma instância da classe de contexto: AppDbContext.
Geralmente se costuma implementar o padrão repositório criando uma interface e uma classe concreta mas para simplificar eu vou criar apenas uma classe onde vou injetar a instância do contexto: (Além disso a classe DbContext é uma combinação dos padrões Unit Of Work e Repository.)
using AlunosApi.Context; using AlunosApi.Models; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;
namespace AlunosApi.Services public AlunosService(AppDbContext context) public async Task<IEnumerable<Aluno>> GetAlunos() public async Task CreateAluno(Aluno aluno) public async Task UpdateAluno(Aluno aluno) public async Task<Aluno> GetAluno(int id) public async Task DeleteAluno(Aluno aluno) public async Task<IEnumerable<Aluno>> GetAlunoByNome(string nome) |
Nesta classe de serviço criamos os seguintes métodos assíncronos usando os recursos de async/await e Task:
Vamos agora usar esta classe no controlador AlunosController que iremos criar na pasta Controllers.
Na classe AlunosController vamos injetar uma instância da classe AlunosService e para isso devemos registrar este serviço no método ConfigureServices da classe Startup:
public void ConfigureServices(IServiceCollection services) { services.AddControllers();
services.AddDbContext<AppDbContext>(options => services.AddSwaggerGen(c =>
}); |
Criando o controlador AlunosController
Na pasta Controllers vamos criar o controlador AlunosController:
using AlunosApi.Models; using AlunosApi.Services; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Threading.Tasks;
namespace AlunosApi.Controllers public AlunosController(IAlunoService alunoService) [HttpGet] [HttpGet("{id:int}", Name = "GetAluno")] if (aluno == null) return Ok(aluno); [HttpPost] [HttpGet("AlunosPorNome")] if (alunos == null) return Ok(alunos); [HttpPut("{id:int}")] [HttpDelete("{id:int}")] |
Neste código temos a implementação da nossa API usando os verbos HTTP e mapeando os métodos para expor os endpoints da nossa API. Assim definimos:
Os verbos HTTP usados em cada request descrevem o que fazer com o recurso. No nosso exemplo estamos realizando um CRUD.
Nota: No Bloco try/catch podemos retornar BadRequest ou outro código de status como 500 InternalServerError.
Além disso no request e response usados temos os seguintes participantes:
Com isso temos todos os endpoints da API definidos e podemos testar usando a interface do Swagger ou do Postman.
Habiliando o CORS
Antes de prosseguir precisamos realizar a última configuração na API que é habilitar o CORS.
A sigla CORS ou Cross-Origin Resource Sharing ou 'compartilhamento de recursos de origem cruzada' é um padrão W3C sendo uma especificação de uma tecnologia de navegadores que define meios para um servidor permitir que seus recursos sejam acessados por uma página web de um domínio diferente.
Usando o CORS, um servidor pode permitir algumas solicitações de origem cruzada (domínio) e rejeitar outras. E para permitir que o nosso projeto React acesse a nossa API precisamos habilitar o CORS no projeto API.
Para fazer isso precisamos adicionar o grupo de políticas no método ConfigureServices usando o método AddCors, e, depois selecionar a política desejada no método Configure da classe Startup.
Assim no método ConfigureServices da classe Startup vamos incluir o código abaixo:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddDbContext<AppDbContext>(options => services.AddScoped<IAlunoService, AlunosService>(); services.AddCors(); services.AddSwaggerGen(c => |
Este código instala o middleware para o CORS incluindo-o no pipeline.
E a seguir no método Configure da mesma classe vamos incluir o código a seguir:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "AlunosApi v1")); } app.UseCors(options => app.UseHttpsRedirection(); |
No código usado estamos habilitando o CORS e definindo que serão permitidas requisição com origem em 'http://localhost:3000' que é a Url a partir de onde a nossa aplicação React vai enviar as requisições e também estamos permitindo qualquer método e qualquer Header.
Com isso nossa API poderá atender as requisições feitas pela nossa aplicação React.
Na próxima parte do artigo iremos testar a nossa API.
"Os meus olhos anteciparam as vigílias da noite, para
meditar na tua palavra."
Salmos 119:148
Referências:
ASP.NET Core Web API - Tratamento de erros
ASP .NET Core MVC - Tratamento de exceções - II
ASP .NET Core - Implementando a segurança com ...