🚀 Capítulo 17: Introdução ao Spring Boot e Consumo de APIs

🎯 Objetivo da Aula

Ao final desta aula, você será capaz de criar um projeto utilizando o framework Spring Boot, compreender o conceito de APIs REST e criar um endpoint que consome dados de uma API externa pública (a PokeAPI).


🏢 O Cenário Prático (Seu Desafio)

Você está desenvolvendo um aplicativo de Pokédex. Para obter os dados oficiais dos Pokémon (como peso, altura e habilidades), você não precisa digitar tudo na mão. O seu desafio é fazer o seu programa Spring Boot se conectar à PokeAPI (uma API pública mundial) e buscar os dados de um Pokémon específico via internet!


🧠 Fundamentos: A Teoria Traduzida

Até agora, nossos programas eram isolados. Agora, vamos fazê-los conversar com o mundo!

  • API REST: É um sistema web que disponibiliza dados para outros sistemas.
  • Consumir uma API: É o ato de o seu programa fazer uma requisição (pedido) para outra API na internet e ler a resposta dela.
  • RestTemplate: É a ferramenta do Spring que funciona como um “navegador de internet” dentro do seu código, permitindo acessar outras URLs.

Fluxo de Consumo

flowchart LR
    A["Seu Programa Java"] -->|Requisição HTTP| B["PokeAPI (Internet)"]
    B -->|Resposta JSON| A

📖 Exemplo Guiado

Vamos criar uma API que busca dados na PokeAPI.

🛠️ Passo a Passo para Criar o Projeto no VS Code

  1. Abra o VS Code.
  2. Pressione as teclas Ctrl + Shift + P.
  3. Digite Spring Initializr: Create Maven Project e pressione Enter.
  4. Selecione a versão estável do Spring Boot e a linguagem Java.
  5. Digite o Group ID: com.pokedex e o Artifact ID: buscapokemon.
  6. Selecione a versão do Java.
  7. Dependências: Busque e adicione a dependência Spring Web. Pressione Enter para confirmar.
  8. Escolha a pasta e abra o projeto.

📂 Estrutura Inicial de Pastas

buscapokemon/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/pokedex/buscapokemon/
│       │       └── BuscapokemonApplication.java
│       └── resources/
│           └── application.properties
└── pom.xml

Siga os passos para criar o nosso controlador que consome a API:

  1. Crie o arquivo PokemonController.java na pasta com/pokedex/buscapokemon/:
package com.pokedex.buscapokemon;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
 
@RestController
public class PokemonController {
 
    @GetMapping("/pokeapi/{nome}")
    public String buscarPokemon(@PathVariable String nome) {
        // Criamos o cliente para fazer a requisição
        RestTemplate restTemplate = new RestTemplate();
        
        // URL da API pública
        String url = "https://pokeapi.co/api/v2/pokemon/" + nome;
        
        // Faz a chamada e recebe a resposta como texto (JSON)
        String resposta = restTemplate.getForObject(url, String.class);
        
        return resposta; // Retorna o JSON direto para o navegador
    }
}
  1. Rode o projeto clicando em Run no arquivo BuscapokemonApplication.java.
  2. Abra o navegador e acesse: http://localhost:8080/pokeapi/ditto (ou mude “ditto” pelo nome de outro Pokémon).

Resultado Esperado: Você verá uma tela cheia de textos em formato JSON com as informações do Pokémon Ditto (habilidades, formas, etc.). Se o texto aparecer, seu consumo de API funcionou!



🛠️ Prática Obrigatória 1

Crie um novo endpoint chamado /pokeapi/habilidade/{id} que use o RestTemplate para buscar os dados de uma habilidade específica na PokeAPI. A URL de destino deve ser: https://pokeapi.co/api/v2/ability/{id}.

Resultado Esperado: Ao acessar http://localhost:8080/pokeapi/habilidade/1, você verá o JSON com os dados da habilidade de ID 1.



🛠️ Prática Obrigatória 2

Mude a porta do servidor para 8082 no arquivo application.properties usando server.port=8082 e teste o endpoint do Ditto novamente.

Resultado Esperado: O endpoint só responderá se você acessar http://localhost:8082/pokeapi/ditto. Se tentar com 8080, dará erro de página não encontrada.


📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

Neste curso, você entregará suas atividades enviando o código para o seu repositório no GitHub usando o aplicativo GitHub Desktop. Siga o passo a passo detalhado:

  1. Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
  2. Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
  3. Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
  4. Faça o Commit:
    • No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex: Finaliza atividades do Capítulo 17.
    • Clique no botão azul Commit to main (ou o nome da sua branch).
  5. Envie para a Nuvem (Push): No topo da tela, clique no botão Push origin. Isso enviará seu código do seu computador para o seu perfil no GitHub.
  6. ⚠️ IMPORTANTE (Repositório Público): Para que o professor consiga corrigir, o seu repositório no GitHub DEVE SER PÚBLICO. Repositórios privados não podem ser visualizados por quem não foi convidado.
  7. Como entregar no Microsoft Teams:
    • Copie o link do seu repositório no GitHub (ex: https://github.com/seu-usuario/seu-repositorio).
    • Abra a tarefa correspondente no Microsoft Teams.
    • Clique no botão Adicionar trabalho (ou Add work).
    • Selecione a opção Link no menu lateral.
    • Cole o link do GitHub no campo “Endereço Web” e digite um texto (ex: Meu Repositório) no campo “Texto a ser exibido”.
    • Clique em Anexar.
    • MUITO IMPORTANTE: Clique no botão Entregar (ou Turn in) no canto superior direito para concluir o envio!

📂 Estrutura Final de Pastas

buscapokemon/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/pokedex/buscapokemon/
│       │       ├── BuscapokemonApplication.java
│       │       └── PokemonController.java
│       └── resources/
│           └── application.properties
└── pom.xml

💡 Checkpoint de Lógica

O que você acabou de fazer é Integração de Sistemas. Na vida real, os sistemas raramente trabalham sozinhos. Eles consultam APIs de CEP (Correios), APIs de pagamento (Cielo, Stone), APIs de mapas (Google Maps), etc. Saber consumir uma API é uma habilidade vital para qualquer desenvolvedor!


🔥 Desafio de Fixação (Opcional)

Tente usar a classe Object em vez de String no restTemplate.getForObject() para ver como o Spring formata o JSON de forma mais bonita no navegador.


🔑 Gabarito de Código/Fórmulas

Prática 1:

@GetMapping("/pokeapi/habilidade/{id}")
public String buscarHabilidade(@PathVariable int id) {
    RestTemplate restTemplate = new RestTemplate();
    String url = "https://pokeapi.co/api/v2/ability/" + id;
    return restTemplate.getForObject(url, String.class);
}

Prática 2:

server.port=8082

Desafio:

@GetMapping("/pokeapi/v2/{nome}")
public Object buscarMelhorado(@PathVariable String nome) {
    RestTemplate restTemplate = new RestTemplate();
    String url = "https://pokeapi.co/api/v2/pokemon/" + nome;
    return restTemplate.getForObject(url, Object.class);
}

Capitulo Anterior | Proximo Capitulo