Introdução

Existem várias maneiras de fazer solicitações HTTP em Node.js. Podemos fazer isso usando o módulo HTTP/HTTPS padrão, é claro, ou podemos usar um dos vários pacotes npm que tornam nossas vidas muito mais fáceis.

Nesta postagem, veremos exemplos de código do módulo HTTPS nativo que vem integrado com a instalação do Node.js, bem como pacotes npm como Axios, Got, SuperAgent e node-fetch. Vamos começar!

Pré-requisitos

Antes de mergulharmos na descrição e no código, a seguir estão alguns pré-requisitos que você precisa para sujar as mãos com alguns códigos Node.js, que envolve chamar uma API JSON remota de simulação:

  • Você deve ter Node.js em execução em sua máquina ( talvez como um contêiner Docker ) Todos os exemplos serão executados usando Node.js 14.x, o LTS ativo
  • Você está familiarizado com comandos npm como npm init e pode instalar pacotes npm com npm install--save em um projeto
  • Você pode executar os arquivos JavaScript com node em sua linha de comando para ver o exemplo de saída
  • Você está familiarizado com callbacks, promessas e async/await

Coisas básicas, mas é bom verificá-las antes de prosseguir com a aula 🙂

O exemplo que usaremos

Faremos um exemplo de solicitação GET com todas as opções do cliente HTTP chamando dados da API simulada JSONPlaceholder . Ele nos enviará de volta os dados de 10 usuários. Imprimiremos o nome e a identificação de cada usuário.

Todo o código será apresentado como uma solicitação pull separada. Você pode ver todos os exemplos de código coletados neste repositório de código aberto em GitHub . O primeiro exemplo é baseado em callback, os próximos dois são baseados em promessa e os dois últimos usam async/await.

Opções de cliente para solicitações HTTP em Node.js

Examinaremos cinco opções para fazer a chamada GET HTTP para a API de espaço reservado. O Node.js tem módulos integrados para realizar muitas ações relacionadas a HTTP (S), uma das quais é a capacidade de fazer chamadas HTTP. Vamos começar com a opção HTTP (S) nativo que vem com o Node.js como nosso primeiro exemplo.

Módulo Node.js HTTP (S) padrão

Node.js vem com HTTP e HTTPS na biblioteca padrão. Para o nosso exemplo, como é um URL HTTPS, usaremos o módulo HTTPS para realizar a chamada GET. Abaixo está o exemplo de código:

 const https=require ('https'); https.get ('https://jsonplaceholder.typicode.com/users', res=> { deixe dados=[]; const headerDate=res.headers && res.headers.date? res.headers.date:'sem data de resposta'; console.log ('Código de status:', res.statusCode); console.log ('Data no cabeçalho da resposta:', headerDate); res.on ('dados', chunk=> { data.push (chunk); }); res.on ('end', ()=> { console.log ('Resposta encerrada:'); usuários const=JSON.parse (Buffer.concat (dados).toString ()); para (usuário de usuários) { console.log (`Obteve o usuário com id: $ {user.id}, nome: $ {user.name}`); } });
}). on ('erro', err=> { console.log ('Erro:', err.message);
});

Vamos examinar o código. Primeiro, exigimos o módulo Node padrão https , que está disponível com a instalação do Node.js. Não há necessidade de um arquivo package.json ou qualquer npm install--save para fazer isso funcionar.

Em seguida, chamamos nosso URL JSONPlaceholder com o método get , que possui um retorno de chamada que fornece a resposta que colocamos na variável res .

Em seguida, inicializamos data como um array vazio e, depois disso, registramos o código de status e a data do cabeçalho do respone. Posteriormente, sempre que obtemos dados, colocamos o pedaço na matriz de dados.

Então, no final da resposta, concatamos os dados do array, os transformamos em uma string e analisamos o JSON para obter a lista de 10 usuários como um array de objetos. Consequentemente, percorremos os 10 usuários e registramos o ID e o nome do objeto de usuário, um de cada vez.

Uma coisa a ser observada aqui: se houver um erro na solicitação, a mensagem de erro será registrada no console. O código acima está disponível como uma solicitação pull para sua referência.

Como HTTPS é um módulo Node.js padrão, não há necessidade de um package.json -gostaria de poder dizer isso para alguns dos meus projetos Node.js.

Você pode executar o código simplesmente com node native-https.js , desde que tenha nomeado o arquivo native-https.js . Deve mostrar uma saída como abaixo:

Saída do código nativo do nó

Você pode usar o mesmo método para executar todos os outros exemplos nesta postagem; eles mostrarão uma saída semelhante à medida que imprimimos o código de status, a data do cabeçalho da resposta e o ID do usuário e o nome do corpo da resposta.

O próximo na linha de exploração é o pacote Axios npm-para isso, precisaremos de um arquivo package.json . É hora de ver como.

Axios

Axios é uma promessa muito popular biblioteca de pedidos baseada em É um cliente HTTP disponível para navegador e Node.js. Ele também inclui recursos úteis como interceptar dados de solicitação e resposta e a capacidade de transformar automaticamente os dados de solicitação e resposta em JSON.

Podemos instalar o Axios com o seguinte comando:

 npm install-salvar axios

Então podemos começar a usá-lo. Vejamos o exemplo de como chamar nossos usuários fictícios de API JSON com Axios:

 const axios=require ('axios'); axios.get ('https://jsonplaceholder.typicode.com/users') .então (res=> { const headerDate=res.headers && res.headers.date? res.headers.date:'sem data de resposta'; console.log ('Código de status:', res.status); console.log ('Data no cabeçalho da resposta:', headerDate); const users=res.data; para (usuário de usuários) { console.log (`Obteve o usuário com id: $ {user.id}, nome: $ {user.name}`); } }) .catch (err=> { console.log ('Erro:', err.message); });

Como você pode ver, há menos código aqui do que no exemplo anterior. Ele é baseado em promessa e não orientado para retorno de chamada, portanto, esse código pode ser facilmente transformado em formato assíncrono/aguardar, se desejar.

Vamos explicar o que o exemplo de código está fazendo. Primeiro, exigimos a biblioteca axios e, em seguida, chamamos a API de usuários JSONPlaceholder com axios.get (que é baseado em promessa).

Usamos o método then para obter o resultado quando a promessa for resolvida e obter o objeto de resposta como uma variável res . No método then , registramos o código de status e a data do cabeçalho da resposta.

Obtemos os dados JSON como uma matriz facilmente com res.data graças às transformações automáticas do Axios. Consequentemente, percorremos os usuários, registrando o ID e o nome. Em caso de erro, registramos a mensagem de erro no console. O exemplo de código também pode ser acessado como uma solicitação pull .

A seguir, daremos uma olhada em outra biblioteca popular e rica em recursos, Got.

Obtido

Got é outra biblioteca de solicitação HTTP popular para Node.js. Ele afirma ser uma “biblioteca de solicitação de HTTP amigável e poderosa para Node.js.” Ele também apresenta uma API baseada em promessa e o suporte a HTTP/2 e sua API de paginação são USPs de Got. Atualmente, Got é a biblioteca de cliente HTTP mais popular para Node.js, com mais de 19 milhões de downloads por semana.

Podemos instalar o Got com o comando abaixo:

 instalação npm-salvar obtido

Abaixo está um exemplo rápido do uso de Got to get the users de nossa API simulada:

 const got=require ('got'); got.get ('https://jsonplaceholder.typicode.com/users', {responseType:'json'}) .então (res=> { const headerDate=res.headers && res.headers.date? res.headers.date:'sem data de resposta'; console.log ('Código de status:', res.statusCode); console.log ('Data no cabeçalho da resposta:', headerDate); const users=res.body; para (usuário de usuários) { console.log (`Obteve o usuário com id: $ {user.id}, nome: $ {user.name}`); } }) .catch (err=> { console.log ('Erro:', err.message); });

Este exemplo de código é muito semelhante ao Axios, mas com duas diferenças principais:

  1. Precisávamos passar {responseType:'json'} como o segundo parâmetro para indicar que a resposta estava no formato JSON.
  2. O cabeçalho do código de status chamava-se statusCode , não status .

Outras coisas permaneceram basicamente as mesmas do pedido anterior com Axios. O exemplo pode ser visto nesta solicitação pull também.

A seguir, daremos uma olhada no Superagent.

SuperAgent

SuperAgent da VisionMedia é um dos pacotes de solicitação Node.js mais antigos, lançado em Abril de 2011 . Uma biblioteca HTTP robusta para Node.js, o SuperAgent marca a si mesmo como uma”biblioteca de solicitação HTTP pequena e progressiva do lado do cliente e módulo Node.js com a mesma API, suportando muitos recursos de cliente HTTP de alto nível”Ele oferece APIs de retorno de chamada e baseadas em promessa. Com uma API baseada em promessa, usar async/await é apenas um açúcar sintático em cima disso.

O SuperAgent também apresenta uma variedade de plug-ins , variando de sem cache a medição de tempos HTTP.

Podemos instalar o SuperAgent com o seguinte comando:

 npm install--save superagent

Vejamos como nosso exemplo de chamada de API de usuários se parece com o SuperAgent. Para fornecer alguma variedade, usaremos async/await para esta ilustração com uma Expressão de Função Imediatamente Invocada (IIFE) em comparação com um exemplo baseado em promessa:

 const superagent=require ('superagent'); (assíncrono ()=> { tentar { const res=await superagent.get ('https://jsonplaceholder.typicode.com/users'); const headerDate=res.headers && res.headers.date? res.headers.date:'sem data de resposta'; console.log ('Código de status:', res.statusCode); console.log ('Data no cabeçalho da resposta:', headerDate); const users=res.body; para (usuário de usuários) { console.log (`Obteve o usuário com id: $ {user.id}, nome: $ {user.name}`); } } catch (errar) { console.log (err.message);//pode ser console.error }
}) ();

Vamos examinar mais detalhadamente como fizemos a solicitação com o SuperAgent. Requeremos a biblioteca superagent para fazer nossa chamada HTTP GET de teste. Iniciamos o IIFE com async porque queremos usar o await, conforme mencionado no próximo ponto.

Em seguida, no bloco try , chamamos superagent.get com await , o que resolveria a promessa e nos daria o resultado de a chamada HTTP para nossa API de usuários fictícios. Então, na variável res , escolhemos a data de res.headers e registramos o status e a data no console.

Depois disso, definimos o corpo da resposta na constante users e percorremos essa matriz de 10 usuários para imprimir o nome e ID de cada usuário. Consequentemente, existe um bloco catch ; se ocorrer algum erro em qualquer lugar no bloco try , ele será detectado e a mensagem de erro será registrada no console.

O SuperAgent é maduro e testado em batalhas, o que o torna bastante confiável. Também podemos testar chamadas do SuperAgent com SuperTest , que é uma biblioteca muito útil por si só. Como os exemplos acima, o código do SuperAgent está disponível como uma solicitação pull .

Agora vamos dar uma olhada na busca de nó.

node-fetch

node-fetch é outra biblioteca de solicitação HTTP muito popular para Node.js-na primeira semana de dezembro 2020, ele foi baixado mais de 20 milhões de vezes, de acordo com tendências de npm .

Em suas próprias palavras, “node-fetch é um módulo leve que traz a API Fetch ( window.fetch ) para Node.js.” Seus recursos incluem consistência com o window.fetch baseado em navegador e promessa nativa e funções assíncronas.

Podemos instalar o node-fetch com o comando abaixo:

 npm install-salvar node-fetch

A seguir, vamos dar uma olhada em como o node-fetch pode ser usado para chamar nossa API de usuários fictícios. Este exemplo também usará async/await para manter as coisas simples:

 const fetch=require ('node-fetch'); (assíncrono ()=> { tentar { const res=await fetch ('https://jsonplaceholder.typicode.com/users'); const headerDate=res.headers && res.headers.get ('date')? res.headers.get ('data'):'sem data de resposta'; console.log ('Código de status:', res.status); console.log ('Data no cabeçalho da resposta:', headerDate); const users=await res.json (); para (usuário de usuários) { console.log (`Obteve o usuário com id: $ {user.id}, nome: $ {user.name}`); } } catch (errar) { console.log (err.message);//pode ser console.error }
}) ();

Vamos revisar algumas das diferenças aqui em comparação com nosso exemplo de uso do SuperAgent com async/await:

  1. fetch não precisava de um método GET explícito; o verbo HTTP pode ser enviado como uma chave método no segundo parâmetro, que é um objeto. Por exemplo: {method:'GET'}
  2. Outra diferença é que o cabeçalho é um objeto com um método get para obter os valores do cabeçalho. Chamamos res.headers.get ('date') para obter o valor do cabeçalho de resposta de data
  3. A diferença final foi a necessidade de desembrulhar uma promessa de obter o corpo como JSON com await res.json () . Pareceu um pouco de trabalho extra, mas é assim que o navegador Fetch API resposta funciona.

Da mesma forma que todos os exemplos acima, este código também pode ser acessado como uma solicitação pull para sua referência.

Agora é hora de comparar as quatro bibliotecas que acabamos de analisar.

Uma comparação rápida dos métodos de solicitação Node HTTP

Exceto para o módulo Node padrão HTTP/HTTPS, todas as outras quatro bibliotecas de cliente HTTP para Node.js estão disponíveis como pacotes npm. Abaixo está uma visão rápida de suas estatísticas de download por semana nos últimos seis meses, via tendências de npm :

Estatísticas de download de tendências NPM

Em termos de downloads semanais, node-fetch foi o mais popular, e SuperAgent foi o menos popular nos últimos seis meses. Vamos examinar algumas outras métricas para uma melhor imagem da popularidade entre esses concorrentes, graças à tabela de comparação no repositório Got GitHub:

<”Axios <✓Got <”Superagent node-fetch
estrelas do GitHub 80,55 K 8,81 K 15,49 K 5,92 K
Tamanho de instalação 388kB 1,32 MB 1,70 MB 155kB
downloads npm (por semana) 16,46 milhões 19,06 milhões 3,90M 17,58 milhões

Da tabela acima, node-fetch é o pacote mais baixado. O SuperAgent tem o maior tamanho de instalação com 1,70 MB, e o Axios tem o maior número de estrelas no GitHub com 80,55K-mais do que todas as outras três bibliotecas combinadas.

Conclusão

Usei o SuperAgent extensivamente alguns anos atrás; depois disso, mudei para Axios. Com sua longa lista de recursos, quero fazer uma tentativa em um futuro próximo. Embora node-fetch pareça promissor e tenha um tamanho de instalação pequeno, não tenho certeza se a API é amigável o suficiente-pelo menos para mim.

Você deve notar que não mencionei o pacote Solicitar npm. Embora Request ainda seja ultra popular (22,36 milhões de downloads por semana), em 11 de fevereiro de 2020, ele terá sido totalmente obsoleto , então não há por que usar uma biblioteca obsoleta.

Todas essas bibliotecas fazem basicamente a mesma coisa-muito parecido com a marca de café de sua preferência, no final, você ainda está bebendo café. Escolha sabiamente, dependendo do seu caso de uso, e faça as trocas certas para obter o máximo benefício.

A postagem 5 maneiras de fazer HTTP solicitações em Node.js apareceram primeiro no LogRocket Blog .

Source link