0

PokédexAPI – Criando uma API com .Net 5, em 5 minutos ou menos!!!

José Junior
José Junior

Uma API (Application Programming Interface ou Interface de Programação de Aplicação), é um conjunto de rotinas, normas e/ou padrões de programação que possibilita a comunicação entre plataformas baseado na Web.


Como um aluno me perguntou um dia “API é uma forma de integração?”


E a resposta para isso é “SIM”, uma vez que elas permitem que um sistema forneça informações e serviços que podem ser “consumidos” ou utilizados por outros sistemas, sem a necessidade de o sistema que a utiliza conheça os detalhes da implementação da própria API (O que nos lembra do encapsulamento da OO – Orientação a Objetos).

Teorias a parte vamos ao desenvolvimento!!!


Fase 1 – Preparação


Para a criação deste projeto eu utilizei o Visual Studio Code (disponível em: <https://code.visualstudio.com>), o .NET SDK 5.0 (disponível em: <https://dotnet.microsoft.com/download/dotnet/5.0> e um arquivo JSON com os dados dos Pokémon que a API irá retornar disponível em um outro projeto que desenvolvido com meus alunos, que pode ser baixado no repositório do GitHub <https://github.com/gallojunior/Pokedex/blob/master/Pokedex/Dados/dados.json>. As imagens associadas a cada Pokémon também estão disponíveis no projeto e serão abordadas em um artigo futuro.


Fase 2 – Criando a aplicação


Crie uma pasta para conter o projeto, no meu caso, chamei esta pasta de “PokedexAPI”, que será o mesmo nome do projeto.

Abra essa pasta no Visual Studio Code. Pressione “ Ctrl + ‘ ”, para exibir o terminal e então digite:


dotnet new webapi


O comando acima, irá criar um projeto do tipo Web API, utilizando o template padrão do .NET 5, o que vai agilizar o nosso desenvolvimento.

Se você reparar a pasta agora não está mais vazia, e já temos uma API funcional. O que precisamos agora e incluir e alterar este projeto. Para isso vamos começar removendo o arquivo “WeatherForecast.cs” e de dentro da pasta “Controllers” o arquivo “WeatherForecastController”.


Agora vamos criar duas pastas no projeto, uma pasta “Dados” e outra “Classes”.


Adicione o arquivo “dados.json”, baixado do repositório GitHub na pasta “Dados”, esse arquivo vai servir como base de dados de nossa API.


Na pasta “Classes” adicione um novo arquivo com o nome “Pokemon.cs”, é nesse arquivo que vamos criar a classe definida abaixo, que servirá para representar os dados dos nossos Pokémons.


using System.Collections.Generic;

namespace PokedexAPI.Classes
{
    public class Pokemon
    {
        // Atributos
        public int Numero { get; set; }
        public string Nome { get; set; }
        public string Descricao { get; set; }
        public string Especie { get; set; }
        public List<string> Tipo { get; set; }
        public double Altura { get; set; }
        public double Peso { get; set; }
        public string Imagem { get; set; }
        // Método Construtor
        public Pokemon()
        {
            Tipo = new List<string>();
        }
    }
}


Agora crie um arquivo na pasta “Controllers” com o nome “PokemonController.cs”, e adicione o código abaixo:


using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using PokedexAPI.Classes;

namespace PokedexAPI.Controllers
{
    [ApiController]
    [Route("api/pokemons")]
    public class PokemonController : ControllerBase
    {
        private readonly ILogger<PokemonController> _logger;

        public PokemonController(ILogger<PokemonController> logger)
        {
            _logger = logger;
        }

        // GET: api/<PokemonController>
        [HttpGet]
        public List<Pokemon> Get()
        {
            StreamReader r = new StreamReader(@"Dados\dados.json");
            string json = r.ReadToEnd();
            List<Pokemon> pokemons = JsonSerializer.Deserialize<List<Pokemon>>(json);
            return pokemons;
        }

        // GET api/<PokemonController>/5
        [HttpGet("{id}")]
        public Pokemon Get(int id)
        {
            StreamReader r = new StreamReader(@"Dados\dados.json");
            string json = r.ReadToEnd();
            List<Pokemon> pokemons = JsonSerializer.Deserialize<List<Pokemon>>(json);
            var pokemon = pokemons.Where(p => p.Numero == id).SingleOrDefault();
            return pokemon;
        }

    }
}

Basicamente o que estamos fazendo é criar um controlador que receberá as requisições e irá processar os pedidos da API.

No método Get(), nossa API, irá utilizar um objeto StreamReader e a função ReadToEnd(), para realizar a leitura dos dados contidos no arquivo dados.json, então para demonstração, utilizamos o “System.Text.Json”, para serializar esses dados string em uma lista de objetos do tipo Pokemon, que são retornados pelo método e a API se encarrega de fornecer esses dados novamente no formato JSON.

Vale ressaltar aqui, que o processo de serialização foi incluído para demonstrar como é feito essa funcionalidade, poderíamos simplesmente alterar o método e devolver o arquivo JSON, mas também poderíamos estar utilizando outras formas de conseguir esses dados, utilizando um banco de dados por exemplo.

No método Get(int id), o processo de funcionamento é o mesmo do Get(), porém a diferença é que apenas um Pokemon é retornado, assim filtramos e retornarmos apenas um objeto.


E estamos pronto para execução, abra novamente o terminal ( Ctrl + ‘ ) e digite:


dotnet run


Será exibido algumas linhas, semelhantes as dispostas abaixo:

Compilando...
info: Microsoft.Hosting.Lifetime[0]
     Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
     Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
     Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
     Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
     Content root path: D:\Projetos\PokedexAPI


Para testar sua API, você pode abrir seu navegador e entrar com um dos endereços acima https://localhost:5001 ou http://localhost:5000,  e adicione ao final do endereço que preferir “/api/pokemons” para executar o método Get() ou “/api/pokemons/6” para executar o método Get(int id).


Para receber todos os pokemons: https://localhost:5001/api/pokemons

Para receber apenas o “Charizard”: https://localhost:5001/api/pokemons/6


Detalhe Extra:

Caso você repare no retorno irá perceber que apesar da classe estar com seus atributos com a primeira letra maiúscula, no retorno do JSON, todos os atributos dos objetos estão em minúsculo. Para evitar isso, e manter a formatação do objeto no retorno do JSON, faça a alteração no método ConfigureServices do arquivo Startup.cs, alterando a definição do serviço de Controllers:


services.AddControllers().AddJsonOptions(options =>
{
	options.JsonSerializerOptions.PropertyNamingPolicy = null;
});


Agora é só compilar e executar novamente.

PS.: para parar a execução anterior pasta digitar “Ctrl + C” no terminal.


Pessoal, vale ressaltar que esse foi só um exemplo rápido e simples. Particularmente eu prefiro utilizar o Visual Studio Community 2019 para o desenvolvimento pois inclui algumas funcionalidades que facilitam bastante a criação de projetos.


Também estou criando outros projetos (inclusive esse projeto nasceu a partir de uma Pokédex Razor), que disponibilizarei logo, logo.


Se você chegou até aqui, muito obrigado e sinta-se a vontade para deixar sua opinião e sugestões!!!!


0
0

Comentários (11)

0
Thiago Guedes

Thiago Guedes

29/03/2021 16:59

José. muuuuito bom artigo!

0
T

Thais Almeida

29/03/2021 16:04

Parabéns professor Gallo !!!


Sensacional, que projeto super detalhado e bem explicado!!! Você é fera !!! Deus abençoe sempre 🙏

0
P

Pedro Correa

29/03/2021 12:25

Boa tarde, gostei muito, perfeito.

0
M

Maria Riscala

29/03/2021 12:20

Parabéns, muito interessante! Projeto excelente.

0
V

Vincius Meronho

29/03/2021 12:20

Muito bom professor Gallo, quando eu crescer quero ser que nem vc

0
L

Lucas Venâncio

29/03/2021 12:20

Parabéns Senhor Gallo Júnior, vc é muito bom


1
Carlos Silva

Carlos Silva

27/03/2021 18:38

Professor Gallo Junior,


Sua abordagem ficou perfeita e muito simples de entender o conceito.

Vou praticar para entender e avançar no tema.


Parabéns,


Att

Carlos Antonio.


1
Sérgio Junior

Sérgio Junior

26/03/2021 15:57

Show de bola, Gallo.

O projeto ficou top.

1
Debora

Debora

26/03/2021 10:54

Muito interessante!

1
Everton Souza

Everton Souza

26/03/2021 11:36

Esse professor Gallo, como sempre saindo na frente, inovando e surpreendendo. Parabéns Gallo,mais um excelente projeto.

None

Brasil