5 Möglichkeiten für HTTP-Anfragen in Node.js

August 09, 2017
Autor:in:
Sam Agnew
Twilion

drone-api

Hallo und Danke fürs Lesen! Dieser Blogpost ist eine Übersetzung von 5 Ways to Make HTTP Requests in Node.js. Während wir unsere Übersetzungsprozesse verbessern, würden wir uns über Dein Feedback an help@twilio.com freuen, solltest Du etwas bemerken, was falsch übersetzt wurde. Wir bedanken uns für hilfreiche Beiträge mit Twilio Swag :)

HTTP-Anfragen sind eine Kernfunktion moderner Programmiersprachen und eines der ersten Dinge, die Entwickler lernen, wenn sie sich mit neuen Umgebungen vertraut machen. Für Node.js gibt es sowohl dank Integrationen in der Sprache als auch durch Beiträge der Community eine angemessene Menge an Lösungen für dieses Problem. Schauen wir uns die gängigsten an.

Wir nutzen die API NASA’s Astronomy Picture of the Day als JSON-API, mit der wir in all diesen Beispielen interagieren. Denn machen wir uns nichts vor – was gibt es Cooleres als das All?

pizza in space

Bevor es losgeht, überprüfe, ob auf deinem Rechner die aktuellen Versionen von Node.js und npm installiert sind.

HTTP – die Standardbibliothek

Ganz oben auf unserer Liste steht das standardmäßige HTTP-Modul in der Standardbibliothek. Mit diesem Modul können wir ohne Installation externer Abhängigkeiten sofort loslegen. Einen Nachteil gibt es allerdings: im Vergleich zu anderen Lösungen überzeugt es nicht gerade in der Benutzerfreundlichkeit.

Der folgende Code sendet eine GET-Anfrage an die NASA-API und druckt die URL für das Astronomiebild des Tages sowie eine Erklärung aus:

const https = require('https');

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

  // A chunk of data has been received.
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // The whole response has been received. Print out the result.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

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

Viele Modulfunktionalitäten von HTTP und HTTPS haben ein recht niedriges Niveau. Anstelle einer bereitgestellten Callback-Funktion, die nach dem Erhalt aller Daten ausgeführt wird, erhalten wir Antwortdaten nur bröckchenweise. Außerdem müssen wir die Antwortdaten manuell parsen. Das klingt zwar in Bezug auf eine JSON-Formatierung recht banal, es ist aber dennoch ein zusätzlicher Schritt.

Ein weiteres Problem ist, dass dieses Modul HTTPS nicht standardmäßig unterstützt. Wir benötigen also das https-Modul, wenn die von uns genutzte API über HTTPS kommuniziert.
Der Weg zu den von uns gewünschten Daten ist zwar etwas steinig, aber wenn wir auf das Hinzufügen zu vieler Abhängigkeiten zu unserem Code verzichten und auf die Low-Level-Funktionalität zugreifen möchten, ist dieses Dienstprogramm ganz hilfreich.

Request

Request ist ein vereinfachter HTTP-Client und mit der requests-Bibliothek von Python vergleichbar. Diese Bibliothek ist um einiges benutzerfreundlicher als das standardmäßige http-Modul und hat sich seit etlichen Jahren in der Community bewährt.

Darauf fällt meine persönliche Wahl zur schnellen Erledigung von Tasks, seitdem ich Node.js verwende. Im Gegensatz zum http-Modul musst du es als Abhängigkeit von npm installieren.

Führe dazu den folgenden Code in dem Verzeichnis deines Terminals aus, das für deinen Code bestimmt ist:

npm install request@2.81.0

Wie du siehst, benötigst du im Vergleich zu oben weniger Code zum Erledigen derselben Task:

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 ist eine fantastische Option, wenn du eine benutzerfreundliche Bibliothek suchst, die mit HTTP-Anfragen auf vernünftige Weise umgeht. Wenn du Promises nutzen möchtest, dann sieh dir die Request-Promise-Bibliothek an.

Axios

Axios ist ein Promise-basierter HTTP-Client für den Browser und node.js. Promises ist ein großer Vorteil, wenn es um Code geht, der kompliziertere Ereignisketten erfordert. Das Schreiben von asynchronem Code kann verwirrend sein, aber Promises ist eine von vielen Lösungen dafür. Sogar für andere Sprachen wie Swift ist es hilfreich.

Gib zur Installation von Axios aus npm den folgenden Befehl in deinem Terminal ein:

npm install axios@0.21.1

Der folgende Code protokolliert die URL und erklärt das Astronomiebild des Tages ebenso:

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 parst JSON-Antworten sogar standardmäßig. Wie praktisch! Wie du siehst, werden Fehler mit .catch() verarbeitet, da wir jetzt Promises nutzen.

Mit axios.all kannst du sogar mehrere gleichzeitige Anfragen stellen, wenn du beispielsweise an den Astronomiebildern von zwei verschiedenen Tagen interessiert bist:

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

Die Arbeit mit asynchronem Code kann schnell komplett unübersichtlich und lästig werden, daher ist Axios sehr praktisch, um dir auf lange Sicht das Leben zu erleichtern.

SuperAgent

Ähnlich wie Axios ist SuperAgent eine weitere verbreitete Bibliothek, die in erster Linie zum Stellen von AJAX-Anfragen im Browser genutzt wird, aber auch mit Node.js funktioniert. Nutze diesen Befehl für die Installation von SuperAgent:

npm install superagent@6.1.0

Das Coole an SuperAgent ist, dass du von weiteren nützlichen Funktionen profitierst, die du in die Anfragen integrieren kannst, zum Beispiel query(), um den Anfragen Parameter hinzuzufügen. In den vorherigen Beispielen haben wir diese nur manuell der URL hinzugefügt, aber hier siehst du die Funktion von SuperAgent dafür:

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

Wie auch bei Axios musst du die JSON-Antwort nicht selbst parsen, was sehr praktisch ist.

Got

Got ist eine weitere gute Wahl, wenn du lieber leichtgängigere Bibliotheken nutzen möchtest. Es kann auch in Twilio Functions verwendet werden.

Installiere Got mit npm erneut:

npm install got@7.1.0

Wie Axios auch funktioniert Got mit Promises. Der folgende Code funktioniert genauso wie der Rest der Beispiele:

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 ist super, wenn du im Vergleich zu Request eher kleinere, nicht so aufgeblasene Bibliotheken bevorzugst.

Abschließende Gedanken

Natürlich fanden hier nicht alle Lösungen Platz, aber du weißt nun, wie die grundlegenden Funktionen in ein paar wenigen, verbreiteten HTTP-Bibliotheken in Node aussehen. Es gibt auch Bibliotheken wie node-fetch, die die fetch-Funktion des Browsers zum Back-End portiert.

Andere Programmiersprachen bieten eine ähnliche Vielfalt an Bibliotheken, um dieses Problem zu lösen. Sieh dir weitere Tutorials zu SwiftPython und Ruby an. Außerdem empfehle ich dir Node.js-Schnellstart als Ort, an dem du dich mit deinen neuen Fähigkeiten austoben kannst.

Wie sendest du HTTP-Anfragen am liebsten? Du kannst mich gerne kontaktieren, um deine Erfahrungen zu teilen oder Fragen zu stellen.