5 maneras de hacer peticiones HTTP en Node

August 09, 2017
Redactado por
Sam Agnew
Twilion

bD7eiJ2xmM2V2XjytuBUv2a6aFoJ0sAsxH4ZCB-92S2uRohNDe7yJduCszi707jVOBlGVBfbjLlZi7zGoy5NyZb_kbiOiV9r0luu2wDQv97qCDSf_5IIsuxeJfN5Q5XBmdsKCTaQ

Hacer peticiones HTTP es una funcionalidad básica para los lenguajes modernos y una de las primeras cosas que muchos desarrolladores deben  aprender para aclimatarse a nuevos entornos. Cuando se trata de Node.js hay una buena cantidad de soluciones a este problema construidos en ambos, en el lenguaje y por la comunidad. Vamos a echar un vistazo a algunos de los más populares.

Vamos a utilizar el API de la NASA Imagen Astronómica del Día como el API JSON con que estaremos interactuando en todos estos ejemplos, porque el espacio es la cosa más genial

Antes de continuar, asegúrese de que tiene la versiones más recientes de Node.js y npm  instalados en su máquina.

HTTP – la Biblioteca Standard

El primero en nuestra lista de éxitos es el módulo predeterminado HTTP de la biblioteca estándar. Con este módulo, se puede conectar y navegar sin tener que instalar dependencias externas. La desventaja es que no es muy fácil de usar en comparación con otras soluciones.

El siguiente código enviará una petición GET  a la API de la NASA e imprimirá la dirección URL de la imagen astronómica del día, así como una explicación

const https = require('https');

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

  // Un fragmento de datos ha sido recibido.
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // Toda la respuesta ha sido recibida. Imprimir el resultado.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

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

Muchas de las funcionalidades del módulo HTTP, y del HTTPS son de bastante bajo nivel. Usted está obligado a recibir datos de respuesta en pedazos o partes en lugar de limitarse a una función de respuesta que se ejecutaría tan pronto como todos los datos son recibidos. También es necesario analizar los datos de respuesta manualmente. Esto es bastante sencillo si se trata de formato JSON, pero sigue siendo un paso adicional

Otro problema es que este módulo no soporta HTTPS  de forma predeterminada, por lo que necesitamos requerir el módulo https si la API que estamos utilizando se comunica a través de HTTPS. Esto puede tomar un poco más de trabajo para obtener los datos que desea, pero es una gran utilidad si no desea agregar demasiadas dependencias a su código base o si quiere tener acceso a sus funcionalidades de bajo nivel.

Request

Request es un cliente HTTP simplificado comparable a la biblioteca Python de peticiones. Esta biblioteca es mucho más fácil de usar que el módulo http predeterminado  y ha sido considerado como la receta de éxito para la comunidad durante varios años.

Esta ha sido mi elección personal desde que he empezado a utilizar Node.js, y es ideal para obtener rápidamente las cosas. A diferencia del módulo http, se tendrá que instalar ésta como una dependencia de npm.

Ejecute el siguiente comando en su terminal desde el directorio en que desea instalar su código:

npm install request@2.81.0

Verá que necesita codificar mucho menos para realizar la misma tarea que hicimos anteriormente:

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 es una opción fantástica si lo que desea es una manera fácil de utilizar la biblioteca que maneja las peticiones HTTP en una manera sana. Si desea utilizar Promises, puede consultar la biblioteca de peticiones de Promises.

Axios

Axios es un cliente Promises para el navegador basado en HTTP, así como para node.js. El uso de Promises es una gran ventaja cuando se trata de código que requiere una cadena de eventos más complicado. Escribir código asíncrono puede resultar confuso, y Promises  es una de varias soluciones a este problema. Es útil incluso en otros idiomas como el Swift.

Para instalar Axios desde npm, introduzca el siguiente comando en el terminal:

npm install axios@0.16.2

El siguiente código realizará la misma tarea de registrar la URL y de explicar la imagen de astronomía del día:

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);
  });

Axios incluso analiza las respuestas JSON por defecto. Muy conveniente! También se  puede ver que el tratamiento de errores se realiza con .catch() ya que estamos utilizando Promises ahora.

Puede incluso hacer múltiples solicitudes simultáneas con axios.all si quería hacer algo como obtener la imagen astronómica de dos días diferentes a la vez:

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);
});

Un código asíncrono puede convertirse fácilmente en algo sobre complicado y desagradable de manejar, y la forma de Axios resuelve este problema puede hacer su vida más fácil en el largo plazo.

SuperAgent

De manera similar a Axios, SuperAgent es otra biblioteca popular usada principalmente para hacer peticiones AJAX en el navegador, pero trabaja en Node.js también. Instale SuperAgent con el siguiente comando:

npm install superagent@3.5.2

Lo que es bueno de SuperAgent es que tiene otras funciones útiles que se pueden encadenar a las peticiones tales como query()  para añadir parámetros a la solicitud. Hemos estado añadiendo simplemente de forma manual en la dirección URL en los ejemplos anteriores, pero notamos cómo SuperAgent le da una función para hacer esto:

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);
});

Al igual que con Axios usted no tiene que analizar la respuesta JSON por si mismo, lo cual es genial

Got

Got es otra opción si quiere una biblioteca más ligera. También está disponible para su uso en Funciones Twilio.

Una vez más, instale Got con npm:

npm install got@7.1.0

De manera similar a Axios, Got trabaja con Promises también. El siguiente código funcionará como lo hace con el resto de los ejemplos

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 es genial si quieres una biblioteca más pequeña que se siente menos “inflada” con  algo así como Request..

Pensamientos Finales

Esto no cubre todas  las soluciones, pero ahora puede ver cómo trabaja la funcionalidad básica en algunas de las bibliotecas HTTP más populares de Node. También hay bibliotecas, tales como nodo-fetch, que integra la funcionalidad de recuperación del navegador fetch  al servidor

Otros lenguajes tienen una variedad similar de bibliotecas para hacer frente a este problema. Prueba estos otros tutoriales en Swift, Python y Ruby.  Además, echa un vistazo a nuestro sitio Node.js Quickstartsun para aplicar tus nuevas habilidades.

¿Cuáles son sus maneras favoritas para enviar peticiones HTTP? No dude en contactarnos para que me haga saber o aclarar sus dudas