// A mesma leitura — os livros de um autor — com fetch e com axios. // Execute com a API da aula 10 no ar: npx tsx src/01-ler-com-fetch-e-axios.ts import axios from 'axios'; import { API_URL, type Livro, type Pagina } from './api.js'; // fetch: a resposta chega em duas etapas. async function comFetch(autor: string): Promise { // URLSearchParams codifica o valor: espaço, acento e "&" não quebram a URL. const consulta = new URLSearchParams({ autor, tamanho: '100' }); // Etapa 1: a promise realiza quando chegam o status e os cabeçalhos. const resposta = await fetch(`${API_URL}/livros?${consulta}`); console.log('fetch status:', resposta.status, resposta.statusText); console.log('fetch content-type:', resposta.headers.get('content-type')); console.log('fetch corpo já lido?', resposta.bodyUsed); if (!resposta.ok) { throw new Error(`GET /livros respondeu ${resposta.status}`); } // Etapa 2: o corpo é lido e interpretado à parte, e só pode ser lido uma vez. const pagina: Pagina = await resposta.json(); console.log('fetch corpo já lido?', resposta.bodyUsed); return pagina.dados; } // axios: uma etapa só; o corpo já vem interpretado em `data`. async function comAxios(autor: string): Promise { const resposta = await axios.get>(`${API_URL}/livros`, { // O axios monta e codifica a query string a partir do objeto. params: { autor, tamanho: 100 }, }); console.log('axios status:', resposta.status, resposta.statusText); console.log('axios content-type:', resposta.headers['content-type']); console.log('axios URL enviada:', axios.getUri(resposta.config)); return resposta.data.dados; } const titulos = (livros: Livro[]) => livros.map((l) => l.titulo).join(' | '); console.log('fetch →', titulos(await comFetch('machado'))); console.log(); console.log('axios →', titulos(await comAxios('machado')));