// Os três desfechos de uma chamada (aula 13, Parte 3) vistos pelos dois // clientes: resposta 2xx, resposta fora da faixa 2xx e nenhuma resposta. import axios, { isAxiosError } from 'axios'; import { API_FORA_DO_AR, API_URL, type Livro, type Pagina } from './api.js'; async function comFetch(url: string): Promise { try { const resposta = await fetch(url); // Chegou aqui: houve resposta, qualquer que seja o status. return `realizou · status ${resposta.status} · ok = ${resposta.ok}`; } catch (erro) { // Só chega aqui quando não houve resposta nenhuma. const causa = erro instanceof Error && erro.cause instanceof Error ? erro.cause : undefined; const codigo = causa && 'code' in causa ? String(causa.code) : '?'; return `rejeitou · ${erro instanceof Error ? erro.message : erro} (${codigo})`; } } async function comAxios(url: string): Promise { try { const resposta = await axios.get(url); return `realizou · status ${resposta.status}`; } catch (erro) { if (!isAxiosError(erro)) throw erro; // `response` existe quando a API respondeu fora da faixa 2xx; // falta quando não houve resposta. return erro.response ? `rejeitou · ${erro.code} · response.status ${erro.response.status}` : `rejeitou · ${erro.code} · sem response`; } } // Um id que existe agora: os ids mudam a cada seed. const { data: pagina } = await axios.get>(`${API_URL}/livros`); const idExistente = pagina.dados[0].id; const casos = [ ['livro existente', `${API_URL}/livros/${idExistente}`], ['livro inexistente', `${API_URL}/livros/999999`], ['id fora do formato', `${API_URL}/livros/abc`], ['API fora do ar', `${API_FORA_DO_AR}/livros`], ] as const; for (const [nome, url] of casos) { console.log(nome); console.log(' fetch :', await comFetch(url)); console.log(' axios :', await comAxios(url)); } // validateStatus decide quais status contam como sucesso. Com ele, o axios // passa a tratar o 404 como o fetch trata: uma resposta a examinar. const resposta = await axios.get(`${API_URL}/livros/999999`, { validateStatus: (status) => status < 500, }); console.log(); console.log('axios com validateStatus (< 500): realizou · status', resposta.status); console.log('corpo de erro da API:', resposta.data);