Introdução: por que precisamos de um cliente HTTP no Node.js?
No desenvolvimento web moderno, é impossível prescindir da interação com serviços externos. Seja para enviar dados para um servidor, obter taxas de câmbio, trabalhar com REST API ou integrar com plataformas em nuvem — tudo isso requer a capacidade de enviar requisições HTTP. No ambiente Node.js, existem várias abordagens para isso: desde o módulo nativo http até bibliotecas de terceiros populares, como axios e o nativo fetch.
Neste artigo, vamos analisar como organizar corretamente um cliente HTTP em JavaScript (Node.js), quais ferramentas escolher para diferentes tarefas e como evitar erros típicos. Você aprenderá como processar respostas, gerenciar assincronia e escrever código limpo e sustentável.
Principais formas de criar requisições HTTP no Node.js
O Node.js oferece ao desenvolvedor várias opções para trabalhar com HTTP. Vamos considerar três principais: o módulo nativo http, a biblioteca axios e o nativo fetch.
1. Módulo nativo http/https
É a forma de mais baixo nível. Ela dá controle total sobre a requisição, mas requer escrever mais código. É adequada para casos onde é necessário minimizar dependências ou trabalhar com protocolos não padronizados.
Exemplo de requisição GET usando o módulo https:
const https = require('https');
function getUsers() { return new Promise((resolve, reject) => { https.get('https://jsonplaceholder.typicode.com/users', (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => resolve(JSON.parse(data))); }).on('error', reject); });}
getUsers().then(users => console.log(users[0].name));Prós: sem dependências externas, controle total.
Contras: código verboso, necessidade de encapsular em Promise, gerenciamento manual de streams.
2. Biblioteca axios
É a biblioteca mais popular para requisições HTTP. Funciona tanto no navegador quanto no Node.js. Suporta Promise, interceptadores (interceptors), parsing automático de JSON e cancelamento de requisições.
Instalação:
npm install axiosExemplo de requisição POST com axios:
const axios = require('axios');
async function createPost() { try { const response = await axios.post('https://jsonplaceholder.typicode.com/posts', { title: 'Cliente HTTP em JavaScript', body: 'Fazendo requisições corretamente', userId: 1 }); console.log('Post criado:', response.data); } catch (error) { console.error('Erro:', error.message); }}
createPost();Prós: API simples, processamento automático de JSON, interceptadores, timeouts.
Contras: requer instalação, tamanho da biblioteca (~14 KB gzip).
3. Nativo fetch (Node.js 18+)
A partir da versão Node.js 18, o fetch tornou-se uma função nativa. Isso unifica o código entre o navegador e o servidor. No entanto, em versões antigas do Node.js, será necessário um polyfill.
Exemplo com fetch e async/await:
async function getUser(id) { const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const user = await response.json(); return user;}
getUser(1).then(user => console.log(user.name));Prós: nativo, não requer instalação, API moderna.
Contras: não suportado no Node.js < 18, sem timeout nativo, requer verificação manual de status.
Tratamento correto de erros e timeouts
Um dos problemas mais comuns ao trabalhar com clientes HTTP é ignorar o tratamento de erros. A rede não é confiável, o servidor pode responder com um erro 500 ou não responder