5 formas de fazer chamadas HTTP no Node.js

August 09, 2017
Escrito por
Sam Agnew
Twilion

drone-api

Realizar chamadas HTTP é uma funcionalidade básica nas linguagens modernas, e uma das primeiras coisas que muitos desenvolvedores aprendem quando estão iniciando em novos ambientes de desenvolvimento. Quando pensamos em Node.js, existem uma quantidade considerável de soluções para este problema construídas dentro da própria linguagem e pela comunidade. Vamos ver algumas das soluções mais populares.

Nós usaremos a API de Foto Astronômica do Dia (APOD) da NASA como uma API JSON que utilizaremos em todos os exemplos, porque o espaço é a coisa mais legal de todos os tempos.

 

giphy.gif

Antes de continuar, você precisa se certificar que possui a versão atualizada do Node.js e npm instaladas na sua máquina.

HTTP – a Biblioteca Padrão

O primeiro sucesso da nossa lista é o módulo HTTP na biblioteca padrão. Com esse módulo, você pode simplismente fazer chamadas sem precisar instalar dependências externas. Em contrapartida, esta não é a solução mais amigável se comparada com as outras.

O código a seguir vai enviar uma requisição GET para a API da NASA e mostrar a URL da foto astronômica do dia, assim como sua explicação:

const https = require('https');

https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
  let data = '';

  // Um bloco de dados foi recebido.
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // Toda a resposta foi recebida. Exibir o resultado.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

}).on("error", (err) => {
  console.log("Erro: " + err.message);
});

Boa parte da funcionalidade do módulo HTTP e HTTPS é muito baixo-nível. Você vai precisar receber os dados de resposta em blocos, no lugar de simplemente incluir uma função de callback para ser executada quando todos os dados forem recebidos. Você também vai precisar tratar os dados de resposta manualmente. Isso é relativamente trivial se está formatado como JSON, mas ainda assim é um passo extra.

Um outro problema é que o módulo não suporta HTTPS por padrão, então nós precisaremos requerer o módulo https caso a API utilizada se comunique usando HTTPS. Pode dar um pouco mais de trabalho para receber os dados que você quer, mas pode ser útil se você não quer adicionar muitas dependências na sua base de código ou quer acesso às funcionalidades de baixo nível.

Request

Atualização: A biblioteca Request foi descontinuada. Não recomendamos que utilize esta biblioteca, embora seja possível realizar a instalação da biblioteca na versão documentada a seguir.

Request é um cliente HTTP simplificado se comparado a biblioteca requests do Python. Ela é muito mais amigável que o módulo padrão http e foi considerada um ponto de partida para a comunidade por vários anos.

Esta tem sido minha escolha pessoal desde que comecei a usar Node.js e é muito boa para tarefas rápidas. Ao contrário do módulo http, você vai ter que instalar esta biblioteca como uma dependência do npm.

Rode o comando a seguir no seu terminal no diretório que seu código será executado:

npm install request@2.81.0

Você vai ver que precisa de muito menos código para fazer a mesma tarefa que fizemos acima:

const request = require('request');

request('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }, (err, res, body) => {
  if (err) { return console.log(err); }
  console.log(body.url);
  console.log(body.explanation);
});

Request é uma opção fantástica se você precisa de uma biblioteca fácil de usar e que lide com requisições HTTP de um jeito sensato. Se você quer usar Promises, você pode conferir a biblioteca request-promise.

Axios

Axios é um cliente HTTP baseado em Promises, tanto para o navegador quanto para o Node.js. Utilizar Promises traz uma grande vantagem para lidar com código que precisa de uma cadeia de eventos mais complexa. Escrever código assíncrono pode ser confuso e Promises são uma das várias soluções para esse problema. Elas são úteis inclusive em outras linguagem como a Swift.

Para instalar o Axios do npm, digite o comando a seguir no seu terminal:

npm install axios@0.21.1

O código a seguir vai realizar a mesma tarefa de exibir a URL e a explicação da foto astronômica do dia:

const axios = require('axios');

axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
  .then(response => {
    console.log(response.data.url);
    console.log(response.data.explanation);
  })
  .catch(error => {
    console.log(error);
  });

O Axios inclusive trata as respostas JSON por padrão. Muito conveniente! Você também pode ver que o tratamento de erros é feito com .catch(), já que estamos usando promises agora.

Você também pode fazer múltiplas requisições simultâneas com axios.all, se você quiser fazer algo como carregar a foto astronômica de dois dias diferentes ao mesmo tempo:

var axios = require('axios');

axios.all([
  axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-03'),
  axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-02')
]).then(axios.spread((response1, response2) => {
  console.log(response1.data.url);
  console.log(response2.data.url);
})).catch(error => {
  console.log(error);
});

Código assíncrono pode facilmente se tornar super complicado e desagradável de lidar, e a maneira como o Axios lida com esse problema, pode tornar sua vida mais fácil no longo prazo.

SuperAgent

Similar ao Axios, SuperAgent é outra biblioteca popular utilizada principamente para fazer requisições AJAX no navegador, mas também funciona no Node.js. Instale o SuperAgent com o seguinte comando:

npm install superagent@6.1.0

O que é legal sobre o SuperAgent é que você tem outras funções muito úteis que você pode encadear na requisição, como a query() para adicionar parâmetros na chamada. Nos exemplos anteriores, estávamos adicionando esses parâmetros manualmente na URL, mas veja que agora o SuperAgent oferece uma função para fazer isso:

const superagent = require('superagent');

superagent.get('https://api.nasa.gov/planetary/apod')
.query({ api_key: 'DEMO_KEY', date: '2017-08-02' })
.end((err, res) => {
  if (err) { return console.log(err); }
  console.log(res.body.url);
  console.log(res.body.explanation);
});

Assim como no Axios, você não precisa tratar a reposta JSON você mesmo, o que é bem legal.

Got

Got é outra opção se você precisa de uma biblioteca mais leve. Ela também está disponível para usar na Twilio Functions.

Da mesma forma, instale o Got com npm:

npm install got@7.1.0

Parecido com Axios, Got também funciona com Promises. O código a seguir vai funcionar da mesma forma que os outros exemplos:

const got = require('got');

got('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }).then(response => {
  console.log(response.body.url);
  console.log(response.body.explanation);
}).catch(error => {
  console.log(error.response.body);
});

Got é ótimo se você deseja uma biblioteca menor que pareça menos “inchada” como a Request.

Considerações Finais

Este artigo não cobre todas as soluções, mas agora você pode ver como a funcionalidade básica funciona em algumas das bibliotecas HTTP mais populares no Node. Existem algumas bibliotecas como a node-fetch, que fornece a funcionalidade de fecth do navegador para o backend.

Outras linguagens possuem uma variedade de bibliotecas similares para lidar com este problema. Confira este outros tutoriais para Swift, Python e Ruby. Verifique também nossos Guias rápido de Node.js para testar seus novos conhecimentos.

Quais são suas formas favoritas de fazer chamadas HTTP? Fique a vontade para falar comigo e tirar dúvidas: