- Aprenda a usar a API Fetch do JavaScript para buscar dados de APIs.
- Entenda como lidar com diferentes métodos HTTP e processar respostas.
- Descubra práticas recomendadas de segurança e desempenho ao usar Fetch.
Introdução à API JavaScript Fetch
A API JavaScript Fetch proporciona uma interface robusta e baseada em promessas para a recuperação de recursos da rede. Sendo assim, ela é amplamente utilizada por desenvolvedores em aplicativos web modernos para facilitar a troca de dados com endpoints RESTful e outros serviços online. O método central, fetch(), requer uma URL como argumento e retorna uma promessa que é resolvida em um objeto Response. Este objeto contém metadados sobre a resposta HTTP, como códigos de status, cabeçalhos e o conteúdo do corpo, acessíveis através de métodos como json(), text() ou blob().
Sintaxe Básica e Configuração de Solicitação
Uma chamada de busca simples é estruturada da seguinte maneira:
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));
Além disso, as opções de configuração podem ser passadas em um segundo objeto de parâmetro. As propriedades incluem método, cabeçalhos, corpo, modo, credenciais e cache. Por outro lado, o método padrão é ‘GET’, enquanto a especificação de ‘POST’ permite o envio de dados. Os cabeçalhos podem ser definidos como uma instância de cabeçalhos ou um objeto simples, possibilitando tipos de conteúdo personalizados, como application/json.
Lidando com Diferentes Métodos HTTP
As solicitações GET são utilizadas para recuperar dados sem efeitos colaterais, adicionando parâmetros de consulta diretamente à URL para filtrar resultados. Em contrapartida, as solicitações POST enviam cargas úteis no corpo, geralmente formatadas como strings JSON após a serialização com JSON.stringify(). Os métodos PUT e PATCH são usados para atualizar recursos existentes, enquanto DELETE é utilizado para removê-los. Cada método segue padrões semelhantes de encadeamento de promessas, mas varia o objeto de configuração conforme necessário.
fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alex', email: 'alex@example.com' })
});
Processando Objetos de Resposta
O objeto Response oferece propriedades como ok, status e statusText. Portanto, verificar response.ok antes da análise evita o processamento de estados de erro. O consumo do corpo ocorre uma única vez por resposta; leituras subsequentes exigem clonagem via response.clone(). Além disso, o streaming de grandes conjuntos de dados utiliza a interface ReadableStream, permitindo o processamento bloco a bloco sem carregar tudo na memória.
Integrando Async/Await para Código Mais Limpo
As funções assíncronas envolvem chamadas de busca, eliminando a necessidade de encadeamentos aninhados de then(). Como resultado, await pausa a execução até que a promessa seja cumprida, melhorando a legibilidade em operações sequenciais, como autenticação seguida da recuperação de dados.
async function loadUserData(userId) {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) throw new Error('Network response failed');
return await response.json();
}
A propagação de erros acontece naturalmente através de blocos try/catch em torno de promessas aguardadas.
Gerenciando Cabeçalhos, CORS e Autenticação
Cabeçalhos personalizados são usados para transmitir tokens de autorização ou chaves de API. O cabeçalho Authorization é utilizado para carregar tokens de portador em fluxos OAuth. O Cross-Origin Resource Sharing (CORS) exige que os servidores incluam cabeçalhos Access-Control-Allow-Origin apropriados. Além disso, as configurações do modo do lado do cliente controlam o comportamento como ‘cors’, ‘no-cors’ ou ‘same-origin’. A inclusão de credenciais por meio da opção de credenciais envia cookies ou dados de autenticação HTTP quando necessário.
Solicitar Cancelamento com AbortController
Solicitações de longa duração podem ser interrompidas usando AbortController. Um AbortSignal é passado para as opções de busca e chamar abort() rejeita a promessa com um AbortError.
const controller = new AbortController();
fetch('https://api.example.com/large-dataset', { signal: controller.signal })
.catch(err => { if (err.name === 'AbortError') console.log('Request cancelled'); });
controller.abort();
Considerações de Desempenho e Estratégias de Cache
A opção de cache determina o comportamento da solicitação: ‘default’, ‘no-store’, ‘reload’, ‘no-cache’, ‘force-cache’ ou ‘only-if-cached’. Os service workers interceptam eventos de busca para implementar estratégias offline primeiro. Além disso, a desduplicação de solicitações e o cache de respostas na camada de aplicação reduzem chamadas de rede redundantes.
Melhores Práticas de Segurança
Valide todos os dados recebidos antes da renderização para mitigar riscos de scripts entre sites. Além disso, evite incorporar credenciais confidenciais no código do lado do cliente. Use HTTPS exclusivamente para criptografar o tráfego e implemente o reconhecimento de limitação de taxa monitorando cabeçalhos de resposta como Retry-After.
Comparação com XMLHttpRequest Legado
Fetch substitui a sintaxe detalhada do XMLHttpRequest por promessas concisas e suporte a fluxos. Ele lida nativamente com JSON, eliminando a necessidade de análise manual de extensões. A compatibilidade do navegador supera 95% globalmente, com polyfills disponíveis para ambientes mais antigos por meio de bibliotecas como whatwg-fetch.
Padrões de Integração do Mundo Real
Combine Fetch com gerenciamento de estado React, acionando chamadas dentro de ganchos useEffect. Em ambientes Node.js, a busca de nó fornece funcionalidade equivalente. O tratamento de paginação extrai cabeçalhos de link ou valores de cursor de respostas para carregar páginas subsequentes sem problemas. A lógica de nova tentativa implementa espera exponencial para falhas transitórias usando funções wrapper em torno da busca.
Essas técnicas formam a base para camadas robustas de busca de dados em aplicativos de página única e aplicativos da web progressivos. Isso nos lembra muito o que discutimos sobre práticas recomendadas de Node.js.
Perguntas Frequentes
O que é a API Fetch do JavaScript?
A API Fetch é uma interface moderna que permite a recuperação de recursos da rede de forma simples e baseada em promessas. Ela substitui a antiga XMLHttpRequest, oferecendo uma sintaxe mais limpa e suporte a operações assíncronas.
Como posso lidar com erros ao usar a API Fetch?
Para lidar com erros, é importante verificar a propriedade ok do objeto Response antes de processar os dados. Além disso, o uso de blocos try/catch em funções assíncronas permite capturar e tratar erros de forma eficaz.
Quais métodos HTTP são suportados pela API Fetch?
A API Fetch suporta diversos métodos HTTP, incluindo GET, POST, PUT, PATCH e DELETE, permitindo a realização de diferentes operações em recursos na web.
Como posso cancelar uma solicitação com a API Fetch?
Você pode cancelar uma solicitação utilizando o AbortController. Ao criar um novo controller, você pode passar seu AbortSignal para a função fetch e chamar abort() para rejeitar a promessa com um AbortError.