Appearance
Kapitel 8: Anfrage & Antwort Verarbeitung
🎯 Lernziele
In diesem Kapitel lernen Sie:
- ✅ GET-Parameter aus URL auslesen (
url-Modul) - ✅ POST-Parameter aus Anfrage-Body auslesen
- ✅ Antwort-Statuscode und Header setzen
- ✅ JSON-Daten als Antwort senden
- ✅ CORS-Probleme lösen (Cross-Origin Resource Sharing)
- ✅ Praxis: GET/POST-Schnittstellen (API) erstellen
8.1 GET-Parameter auslesen
🔗 GET-Parameter (Query String)
Beispiel-URL:
http://localhost:3000/api/nutzer?name=Max&alter=25&stadt=Berlin
└─────────────────────────────────────┘
Query String (?key=value)📦 Methode 1: url-Modul (Legacy)
javascript
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true); // true = query parsen
const pfadname = parsedUrl.pathname; // '/api/nutzer'
const query = parsedUrl.query; // { name: 'Max', alter: '25' }
if (pfadname === '/api/nutzer') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({
nachricht: 'GET-Parameter empfangen',
parameter: query
}));
}
});
server.listen(3000, () => {
console.log('🚀 Server läuft auf http://localhost:3000');
console.log('Testen Sie: http://localhost:3000/api/nutzer?name=Max&alter=25');
});Antwort:
json
{
"nachricht": "GET-Parameter empfangen",
"parameter": {
"name": "Max",
"alter": "25"
}
}📦 Methode 2: URL-Klasse (Modern, empfohlen!)
javascript
const http = require('http');
const server = http.createServer((req, res) => {
// Moderne URL-API verwenden
const aktuelleUrl = new URL(req.url, `http://${req.headers.host}`);
const pfadname = aktuelleUrl.pathname; // '/api/nutzer'
const parameter = aktuelleUrl.searchParams;
if (pfadname === '/api/nutzer') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({
name: parameter.get('name'),
alter: parameter.get('alter'),
stadt: parameter.get('stadt')
}));
}
});
server.listen(3000);8.2 POST-Parameter auslesen
📝 POST-Daten aus dem Body auslesen
POST-Daten werden nicht in der URL übertragen, sondern im Request-Body.
javascript
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'POST' && req.url === '/api/nutzer') {
let body = '';
// Daten chunk-weise empfangen
req.on('data', chunk => {
body += chunk.toString(); // Chunk in String umwandeln
});
// Alle Daten empfangen
req.on('end', () => {
try {
const daten = JSON.parse(body); // JSON parsen
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({
nachricht: 'POST-Daten empfangen',
daten: daten
}));
} catch (err) {
res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ fehler: 'Ungültiges JSON' }));
}
});
} else {
res.writeHead(404, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ fehler: 'Route nicht gefunden' }));
}
});
server.listen(3000, () => {
console.log('🚀 Server läuft auf http://localhost:3000');
console.log('Testen Sie mit POST-Anfrage an /api/nutzer');
});🧪 POST-Anfrage testen (mit curl)
bash
# PowerShell
Invoke-RestMethod -Uri "http://localhost:3000/api/nutzer" `
-Method POST `
-Body '{"name":"Max","alter":25}' `
-ContentType "application/json"
# Oder mit curl
curl -X POST http://localhost:3000/api/nutzer \
-H "Content-Type: application/json" \
-d '{"name":"Max","alter":25}'8.3 Antwort-Statuscode & Header
🔢 Wichtige HTTP-Statuscodes
| Code | Bedeutung | Wann verwenden? |
|---|---|---|
| 200 | OK | Erfolgreiche Anfrage |
| 201 | Created | Ressource erfolgreich erstellt |
| 400 | Bad Request | Ungültige Anfragedaten |
| 401 | Unauthorized | Nicht authentifiziert |
| 403 | Forbidden | Keine Berechtigung |
| 404 | Not Found | Ressource nicht gefunden |
| 500 | Internal Server Error | Serverfehler |
📋 Header setzen
javascript
const http = require('http');
const server = http.createServer((req, res) => {
// Methode 1: writeHead() - Header und Statuscode auf einmal
res.writeHead(200, {
'Content-Type': 'application/json; charset=utf-8',
'X-Powered-By': 'Node.js',
'Cache-Control': 'no-cache'
});
res.end(JSON.stringify({ nachricht: 'Hallo!' }));
// Methode 2: Einzelne Header setzen
// res.setHeader('Content-Type', 'application/json');
// res.statusCode = 200;
// res.end(JSON.stringify({ nachricht: 'Hallo!' }));
});
server.listen(3000);8.4 JSON-Antwort senden
📦 JSON-Antwort senden
javascript
const http = require('http');
const server = http.createServer((req, res) => {
// Beispiel-Daten
const nutzer = [
{ id: 1, name: 'Max', email: 'max@example.com' },
{ id: 2, name: 'Anna', email: 'anna@example.com' }
];
// Header setzen (WICHTIG: Content-Type muss application/json sein!)
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
// JSON senden
res.end(JSON.stringify({
erfolg: true,
anzahl: nutzer.length,
daten: nutzer
}));
});
server.listen(3000, () => {
console.log('🚀 API-Server läuft auf http://localhost:3000');
});Antwort im Browser:
json
{
"erfolg": true,
"anzahl": 2,
"daten": [
{ "id": 1, "name": "Max", "email": "max@example.com" },
{ "id": 2, "name": "Anna", "email": "anna@example.com" }
]
}8.5 CORS-Grundlagen
⚠️ Was ist CORS?
CORS (Cross-Origin Resource Sharing) = Sicherheitsmechanismus, der Cross-Origin-Anfragen blockiert.
Frontend (http://localhost:5173)
↓
Backend (http://localhost:3000)
❌ CORS-Fehler! (Unterschiedliche Ports = Unterschiedliche Origin)✅ CORS konfigurieren
javascript
const http = require('http');
const server = http.createServer((req, res) => {
// CORS-Header setzen (WICHTIG!)
res.setHeader('Access-Control-Allow-Origin', '*'); // Alle Ursprünge erlauben
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
// OPTIONS-Anfrage beantworten (Pre-flight)
if (req.method === 'OPTIONS') {
res.writeHead(204);
res.end();
return;
}
// Normale Anfrage bearbeiten
if (req.method === 'GET' && req.url === '/api/daten') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ nachricht: 'CORS funktioniert!' }));
}
});
server.listen(3000, () => {
console.log('🚀 CORS-fähiger Server läuft auf http://localhost:3000');
});🔒 Produktions-Einstellungen (Sicherer!)
javascript
// ❌ Nicht für Produktion!
res.setHeader('Access-Control-Allow-Origin', '*');
// ✅ Nur bestimmte Origins erlauben
const erlaubteOrigins = ['http://localhost:5173', 'https://meine-seite.de'];
const origin = req.headers.origin;
if (erlaubteOrigins.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
}8.6 Praxis: API erstellen
🛠️ Fallstudie: Vollständige REST-API für "Nutzer"
javascript
const http = require('http');
// "Datenbank" (Array)
let nutzer = [
{ id: 1, name: 'Max', email: 'max@example.com' },
{ id: 2, name: 'Anna', email: 'anna@example.com' }
];
const server = http.createServer((req, res) => {
// CORS-Header
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
// OPTIONS behandeln
if (req.method === 'OPTIONS') {
res.writeHead(204);
res.end();
return;
}
// === ROUTES ===
// 1. Alle Nutzer abrufen (GET /api/nutzer)
if (req.method === 'GET' && req.url === '/api/nutzer') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: true, daten: nutzer }));
return;
}
// 2. Einzelnen Nutzer abrufen (GET /api/nutzer/:id)
if (req.method === 'GET' && req.url.match(/^\/api\/nutzer\/\d+$/)) {
const id = parseInt(req.url.split('/')[3]);
const gefundenerNutzer = nutzer.find(n => n.id === id);
if (!gefundenerNutzer) {
res.writeHead(404, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: false, fehler: 'Nutzer nicht gefunden' }));
return;
}
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: true, daten: gefundenerNutzer }));
return;
}
// 3. Nutzer erstellen (POST /api/nutzer)
if (req.method === 'POST' && req.url === '/api/nutzer') {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
try {
const neuerNutzer = JSON.parse(body);
// Validierung
if (!neuerNutzer.name || !neuerNutzer.email) {
res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: false, fehler: 'Name und Email erforderlich' }));
return;
}
// Neuen Nutzer hinzufügen
neuerNutzer.id = nutzer.length + 1;
nutzer.push(neuerNutzer);
res.writeHead(201, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: true, daten: neuerNutzer }));
} catch (err) {
res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: false, fehler: 'Ungültiges JSON' }));
}
});
return;
}
// 404 - Route nicht gefunden
res.writeHead(404, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ erfolg: false, fehler: 'Route nicht gefunden' }));
});
server.listen(3000, () => {
console.log('🚀 REST-API läuft auf http://localhost:3000');
console.log('\nVerfügbare Endpunkte:');
console.log(' GET /api/nutzer');
console.log(' GET /api/nutzer/:id');
console.log(' POST /api/nutzer');
});🧪 API testen
bash
# 1. Alle Nutzer abrufen
curl http://localhost:3000/api/nutzer
# 2. Einzelnen Nutzer abrufen
curl http://localhost:3000/api/nutzer/1
# 3. Nutzer erstellen
curl -X POST http://localhost:3000/api/nutzer \
-H "Content-Type: application/json" \
-d '{"name":"Clara","email":"clara@example.com"}'📝 Zusammenfassung
In diesem Kapitel haben Sie gelernt:
- ✅ GET-Parameter mit
url-Modul oderURL-Klasse auslesen - ✅ POST-Daten aus dem Request-Body parsen
- ✅ HTTP-Statuscodes und Header setzen
- ✅ JSON-Antworten senden
- ✅ CORS konfigurieren (für Cross-Origin-Anfragen)
- ✅ Praxis: Vollständige REST-API erstellt
🎯 Nächste Schritte
Im nächsten Kapitel werden wir:
fs-Modul vertiefen (synchron vs. asynchron)- Ordneroperationen durchführen
- Dateien batch-verarbeiten
- Pfade fortgeschritten verarbeiten
📚 Weiterführende Ressourcen
🎉 Kapitel 8 abgeschlossen! Weiter zu Kapitel 9: Dateisystem fortgeschritten
