1 / 12
Modulo 3 / JavaScript

Fetch API

Consumo de APIs externas e async/await.

school Aula 16 schedule 2 horas

Conceito

O que é uma API?

hub Interface de comunicação

  • API = Application Programming Interface
  • Permite que sistemas se comuniquem entre si
  • O front-end pede dados, a API responde
  • O formato mais comum é JSON

swap_horiz Fluxo de dados

computer
Front-end faz uma requisição HTTP
south
dns
Servidor processa e retorna dados (JSON)
south
web
Front-end exibe os dados na tela

Formato de dados

JSON

data_object Exemplo de JSON

{ "nome": "Ana", "idade": 22, "ativo": true, "cursos": ["ADS", "Web"], "endereco": { "cidade": "São Paulo", "estado": "SP" } }

Parece um objeto JS, mas as chaves devem usar aspas duplas.

swap_horiz Conversão

// Objeto JS -> JSON (string) const obj = { nome: 'Ana', idade: 22 }; const json = JSON.stringify(obj); // '{"nome":"Ana","idade":22}' // JSON (string) -> Objeto JS const texto = '{"nome":"Ana"}'; const dados = JSON.parse(texto); console.log(dados.nome); // "Ana"
lightbulb O fetch já converte JSON automaticamente com .json().

Conceito importante

Código assíncrono

timer Por que assíncrono?

  • Buscar dados de uma API leva tempo
  • JS nao pode "parar" e esperar a resposta
  • O código continua executando enquanto espera
  • Quando os dados chegam, executa o callback
console.log('1 - Início'); setTimeout(() => { console.log('2 - Depois de 2s'); }, 2000); console.log('3 - Continua'); // Saída: 1, 3, 2

handshake Promises

// Uma Promise representa um valor // que pode estar disponível agora, // no futuro, ou nunca. const promessa = new Promise( (resolve, reject) => { // Simulando busca de dados setTimeout(() => { resolve('Dados prontos!'); }, 1000); } ); promessa .then((dados) => console.log(dados)) .catch((erro) => console.log(erro));

O fetch retorna uma Promise automaticamente.

Fazendo requisicoes

fetch() básico

link Com .then()

fetch('https://api.example.com/users') .then((response) => { return response.json(); }) .then((dados) => { console.log(dados); }) .catch((erro) => { console.log('Erro:', erro); });

format_list_numbered Passo a passo

1 fetch(url) faz a requisição e retorna uma Promise
2 .then(res => res.json()) converte a resposta para objeto JS
3 .then(dados => ...) usa os dados recebidos
4 .catch(erro => ...) trata erros de rede

Sintaxe moderna

async / await

star Forma recomendada

async function buscarUsuarios() { try { const response = await fetch( 'https://api.example.com/users' ); const dados = await response.json(); console.log(dados); } catch (erro) { console.log('Erro:', erro); } } buscarUsuarios();

info Como funciona

async

Marca a função como assíncrona. Permite usar await dentro dela.

await

"Espera" a Promise resolver antes de continuar. O código fica mais legível e sequencial.

try/catch

Trata erros de forma limpa. Substitui o .catch() das Promises.

Na prática

Consumindo uma API real

// API pública: JSONPlaceholder async function carregarPosts() { const url = 'https://jsonplaceholder.typicode.com/posts'; const response = await fetch(url); const posts = await response.json(); const container = document .querySelector('#posts'); posts.slice(0, 5).forEach((post) => { const card = document .createElement('div'); card.className = 'card'; card.innerHTML = ` <h3>${post.title}</h3> <p>${post.body}</p> `; container.appendChild(card); }); } carregarPosts();

public APIs públicas para praticar

jsonplaceholder.typicode.com

Posts, usuários, comentários

pokeapi.co/api/v2

Dados de Pokémon

viacep.com.br/ws/{cep}/json

Busca de endereço por CEP

dog.ceo/api/breeds/image/random

Imagens aleatórias de cachorros

Além do GET

Métodos HTTP

upload POST (enviar dados)

async function criarPost() { const response = await fetch( 'https://api.example.com/posts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: 'Meu post', body: 'Conteúdo...' }) } ); const data = await response.json(); console.log(data); }

category Resumo dos métodos

GET Buscar dados (padrão do fetch)
POST Criar/enviar novos dados
PUT Atualizar dados existentes
DELETE Remover dados

Robustez

Tratamento de erros

warning Verificando a resposta

async function buscarDados(url) { try { const response = await fetch(url); // fetch nao lança erro para 404/500! if (!response.ok) { throw new Error( `Erro: ${response.status}` ); } const dados = await response.json(); return dados; } catch (erro) { console.log('Falhou:', erro); } }

inventory Boas práticas

  • Sempre use try/catch em funções async
  • Verifique response.ok antes de processar
  • Exiba mensagem amigável para o usuário
  • Mostre um loading enquanto carrega
// Padrão: loading -> dados -> erro container.innerHTML = 'Carregando...'; const dados = await buscarDados(url); if (dados) { container.innerHTML = '...'; } else { container.innerHTML = 'Erro ao carregar dados.'; }

Exemplo completo

Busca de CEP

const inputCep = document .querySelector('#cep'); const resultado = document .querySelector('#resultado'); async function buscarCep() { const cep = inputCep.value .replace(/\D/g, ''); if (cep.length !== 8) { resultado.textContent = 'CEP inválido'; return; } resultado.textContent = 'Buscando...'; try { const res = await fetch( `https://viacep.com.br/ws/${cep}/json/` ); const data = await res.json(); if (data.erro) { resultado.textContent = 'CEP nao encontrado'; return; } resultado.innerHTML = ` ${data.logradouro}, ${data.bairro} - ${data.localidade}/${data.uf} `; } catch (erro) { resultado.textContent = 'Erro na conexão'; } } inputCep.addEventListener( 'blur', buscarCep );

pattern Padrão completo

1 Validar entrada do usuário
2 Exibir estado de loading
3 Fazer o fetch com try/catch
4 Verificar se a resposta é válida
5 Exibir dados ou mensagem de erro
lightbulb A ViaCEP é gratuita e nao precisa de autenticação. Perfeita para praticar.

Hora de praticar

Exercício prático

rocket_launch Pokédex

  1. Crie um input para digitar o nome ou número de um Pokémon
  2. Ao clicar em "Buscar", use fetch para consultar a PokeAPI: pokeapi.co/api/v2/pokemon/{nome}
  3. Exiba o nome, imagem, tipo(s) e estatísticas do Pokémon
  4. Mostre "Carregando..." enquanto busca e trate erros (Pokémon nao encontrado)
  5. Estilize os cards com CSS usando as cores do tipo do Pokémon
lightbulb Desafio extra: adicione botões "Anterior" e "Próximo" para navegar entre Pokémons pelo número.
Próxima aula

Aula 17

Projeto prático: App interativa com tudo que aprendemos em JavaScript.

task_alt O que aprendemos hoje

  • check_circle O que é uma API e o formato JSON
  • check_circle Código assíncrono e Promises
  • check_circle fetch() com .then() e async/await
  • check_circle Métodos HTTP: GET, POST, PUT, DELETE
  • check_circle Tratamento de erros e boas práticas
Próxima aula
auto_stories Referência: MDN Fetch API
Leandro Medeiros