Skip to content

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

CodeBedeutungWann verwenden?
200OKErfolgreiche Anfrage
201CreatedRessource erfolgreich erstellt
400Bad RequestUngültige Anfragedaten
401UnauthorizedNicht authentifiziert
403ForbiddenKeine Berechtigung
404Not FoundRessource nicht gefunden
500Internal Server ErrorServerfehler

📋 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 oder URL-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

Frei für alle Anfänger