// Laboratório 1 — Os três desfechos // Execute: npx tsx praticar/01-tres-desfechos.ts (com a API da aula 10 no ar) // // As duas funções abaixo têm o mesmo contrato que `buscarLivro` de // lib/livros.ts no cliente web da aula 13: // - livro existente → devolve o Livro // - 404 → devolve undefined (é resposta prevista, não falha) // - outro status → lança Error com o status na mensagem // - sem resposta → deixa a rejeição do cliente seguir import axios from 'axios'; import { API_FORA_DO_AR, API_URL, descrever, type Livro, type Pagina } from '../src/api.js'; async function buscarComFetch(base: string, id: number | string): Promise { // TODO 1: faça a chamada com fetch. // TODO 2: trate o 404 e os demais status fora da faixa 2xx. Lembre: aqui o // 404 chega como resposta, com `ok` falso. void base; void id; throw new Error('TODO: buscarComFetch'); } async function buscarComAxios(base: string, id: number | string): Promise { // TODO 3: faça a mesma coisa com axios. Escolha UMA das duas formas e // deixe a outra em comentário, explicando a diferença: // (a) try/catch com isAxiosError e erro.response?.status; // (b) validateStatus que aceite o 404. void base; void id; throw new Error('TODO: buscarComAxios'); } const { data } = await axios.get>(`${API_URL}/livros`); const casos: [string, string, number | string][] = [ ['existente', API_URL, data.dados[0].id], ['inexistente', API_URL, 999999], ['fora do formato', API_URL, 'abc'], ['API fora do ar', API_FORA_DO_AR, 1], ]; for (const [nome, base, id] of casos) { for (const [cliente, buscar] of [ ['fetch', buscarComFetch], ['axios', buscarComAxios], ] as const) { try { const livro = await buscar(base, id); console.log(`${nome.padEnd(16)} ${cliente} → ${livro ? livro.titulo : 'undefined (404)'}`); } catch (erro) { console.log(`${nome.padEnd(16)} ${cliente} → ${descrever(erro)}`); } } } // TODO 4: antes de rodar, escreva aqui em comentário o que espera ver em cada // uma das oito linhas. Depois compare.