HTTP-Client in JavaScript: Anfragen richtig stellen in Node.js
Moderne Webentwicklung ist ohne Interaktion mit entfernten Servern undenkbar. Ob es um das Abrufen von Daten von einer REST-API, das Senden von Formularen oder das Hochladen von Dateien geht – HTTP-Anfragen bilden die Grundlage jeder Integration. Wenn Sie mit Node.js entwickeln, haben Sie mehrere leistungsstarke Werkzeuge zur Erstellung eines HTTP-Clients. In diesem Artikel werden wir uns damit befassen, wie man Anfragen richtig stellt: von integrierten Modulen bis hin zu beliebten Bibliotheken, mit Schwerpunkt auf Fehlerbehandlung, Timeouts und Code-Lesbarkeit.
Wir werden drei Hauptansätze betrachten: das integrierte Modul http/https, das moderne fetch (verfügbar in Node.js 18+) und die legendäre Bibliothek axios. Für jeden Ansatz finden Sie praktische Beispiele und Empfehlungen.
1. Integriertes Modul http/https: Der Klassiker
Node.js enthält von Anfang an die Module http und https für die Arbeit mit Netzwerkanfragen. Dies ist die am niedrigsten angesiedelte Methode, die volle Kontrolle über den Prozess bietet. Sie erfordert jedoch mehr Code für die Verarbeitung der Antwort.
Beispiel einer GET-Anfrage mit dem Modul https:
const https = require('https');
function getUsers() { return new Promise((resolve, reject) => { const options = { hostname: 'jsonplaceholder.typicode.com', path: '/users', method: 'GET', headers: { 'Content-Type': 'application/json' } };
const req = https.request(options, (res) => { let data = '';
// Daten stückweise sammeln res.on('data', (chunk) => { data += chunk; });
// Wenn die Antwort vollständig empfangen wurde res.on('end', () => { if (res.statusCode >= 200 && res.statusCode < 300) { resolve(JSON.parse(data)); } else { reject(new Error(`HTTP Error: ${res.statusCode}`)); } }); });
// Behandlung von Netzwerkfehlern req.on('error', (err) => { reject(err); });
// Timeout für den Fall eines Hängens req.setTimeout(5000, () => { req.destroy(); reject(new Error('Request timeout')); });
req.end(); });}
// VerwendunggetUsers() .then(users => console.log('Users:', users.length)) .catch(err => console.error('Error:', err.message));Vorteile:
- Erfordert keine Installation zusätzlicher Pakete.
- Volle Kontrolle über jede Phase der Verbindung.
Nachteile:
- Viel Boilerplate-Code.
- Manuelle Verarbeitung von Chunks und Zusammenbau des Antwortkörpers.
- Unbequeme Arbeit mit Promises ohne Wrapper.
Dieser Ansatz ist gerechtfertigt, wenn Sie eine Bibliothek für die Netzwerkarbeit schreiben oder maximale Leistung ohne unnötige Abhängigkeiten benötigen. In anderen Fällen ist es besser, höherwertige Lösungen zu verwenden.
2. Fetch API: Moderner Standard
Ab Node.js 18 ist fetch eine integrierte Funktion geworden, was es zum primären Werkzeug für HTTP-Anfragen macht. Es basiert auf Promises und hat eine saubere, intuitive Syntax.
Beispiel einer POST-Anfrage mit fetch:
async function createPost() { const url = 'https://jsonplaceholder.typicode.com/posts'; const newPost = { title: 'HTTP-Client in JavaScript', body: 'Anfragen richtig stellen', userId: 1 };
try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newPost) });
// Antwortstatus prüfen if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); }
const data = await response.json(); console.log('Created post ID:', data.id); return data; } catch (error) {