Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Express-API für Zillow Zestimate: Schritt-für-Schritt-Tutorial (Cosc484 Assignment 5)

Lerne, wie du eine Express-API mit drei Endpunkten für Zillow-Zestimates, Haussuche und Preisabfrage erstellst – perfekt für dein Cosc484 Assignment 5.

Express API Tutorial Zillow Zestimate API Cosc484 Assignment 5 Node.js Express Server REST API mit Express Query Parameter Express JSON API bauen CommonJS require Immobilien API Entwicklung Hausbewertung API Zestimate Formel Express Routing API Statuscodes 200 404 Node.js für Anfänger Backend Entwicklung Studium Express Filter Array

Express-API für Zillow Zestimate: Dein Leitfaden für Cosc484 Assignment 5

Stell dir vor, du entwickelst eine API, die Rich Barton, CEO von Zillow, dabei hilft, Hausbewertungen (Zestimates) zu berechnen und Immobiliendaten zu liefern. Klingt spannend? Genau das verlangt das Cosc484 Assignment 5. In diesem Tutorial zeige ich dir, wie du mit Express.js und CommonJS (require) eine JSON-API erstellst. Wir nutzen keine externen Datenbanken, sondern simulieren die Daten mit einem Array. Keine Sorge, wir bleiben beim Thema: Kein HTTP-Modul, nur Express. Und wir achten auf die geforderten Statuscodes 200 und 404.

Dieses Tutorial ist ideal für Studierende der Informatik, die ihre ersten Schritte mit Node.js und Express machen. Du lernst, wie du REST-APIs baust, Query-Parameter verarbeitest und JSON-Antworten formst. Und das alles mit einem aktuellen Bezug: Immobilien-APIs sind heiß begehrt – denk an Plattformen wie Zillow, Immowelt oder ImmoScout. Mit diesem Wissen kannst du später sogar eigene Microservices für Smart-Home-Apps oder Fintech-Lösungen entwickeln.

Voraussetzungen und Setup

Bevor wir loslegen, stelle sicher, dass Node.js (Version 18 oder höher) installiert ist. Erstelle ein neues Verzeichnis für dein Projekt und initialisiere es mit npm init -y. Installiere dann Express mit npm install express. Denk dran: Wir verwenden CommonJS (require), nicht ES6-Importe – sonst gibt es Punktabzug.

Erstelle die Datei zillow.js. Darin schreiben wir den gesamten Code. Der Server soll auf dem Port laufen, der als erstes Kommandozeilenargument übergeben wird. Falls kein Port angegeben ist, könntest du einen Standardport wie 3000 nutzen – aber für die Aufgabe ist der erste Parameter Pflicht.

const express = require('express');
const app = express();

const PORT = process.argv[2] || 3000;

app.listen(PORT, () => {
  console.log(`Server läuft auf Port ${PORT}`);
});

Der erste Endpunkt: Zestimate berechnen

Der erste Endpunkt ist /v1/zillow/zestimate. Er erwartet drei Query-Parameter: sqft, bed und bath – alles Pflichtfelder und als ganze Zahlen. Die Zestimate-Formel lautet: sqft * bed * bath * 10. Das Ergebnis gibst du als JSON mit nur einer Eigenschaft zestimate zurück.

Beispiel: /v1/zillow/zestimate?sqft=2000&bed=3&bath=4 liefert {"zestimate": 240000}.

Hier der Code:

app.get('/v1/zillow/zestimate', (req, res) => {
  const { sqft, bed, bath } = req.query;
  // Prüfen, ob alle Parameter vorhanden und gültige Zahlen sind
  if (!sqft || !bed || !bath || isNaN(sqft) || isNaN(bed) || isNaN(bath)) {
    return res.status(404).json({ error: 'Ungültige oder fehlende Parameter' });
  }
  const zestimate = parseInt(sqft) * parseInt(bed) * parseInt(bath) * 10;
  res.json({ zestimate });
});

Beachte: Wir geben einen 404-Statuscode, wenn die Parameter fehlerhaft sind – so verlangt es die Aufgabenstellung. Bei Erfolg senden wir 200 (Standard).

Zweiter Endpunkt: Häuser nach Stadt filtern

Der zweite Endpunkt ist /v1/zillow/houses. Er nimmt einen optionalen Query-Parameter city entgegen. Wenn city übergeben wird, filterst du das simulierte Array nach passenden Städten. Wird keine Stadt übergeben oder die Stadt nicht gefunden, gibst du ein leeres Array [] zurück.

Unser Array (aus der Aufgabenstellung):

const houses = [
  { price: 240000, city: "baltimore" },
  { price: 300000, city: "austin" },
  { price: 400000, city: "austin" },
  { price: 1000000, city: "seattle" },
  { price: 325000, city: "baltimore" },
  { price: 550000, city: "seattle" },
  { price: 250000, city: "boston" }
];

Beispiel: /v1/zillow/houses?city=baltimore liefert die beiden Häuser aus Baltimore. Der Code:

app.get('/v1/zillow/houses', (req, res) => {
  const city = req.query.city;
  if (!city) {
    return res.json([]);
  }
  const filtered = houses.filter(h => h.city === city.toLowerCase());
  res.json(filtered);
});

Wichtig: Wir vergleichen die Stadt case-insensitive, indem wir den Query-Parameter mit toLowerCase() behandeln. So ist Baltimore oder baltimore beides gültig.

Dritter Endpunkt: Häuser nach Preis filtern

Der dritte Endpunkt ist /v1/zillow/prices. Er erwartet einen erforderlichen Parameter usd. Du gibst alle Häuser zurück, deren Preis kleiner oder gleich dem angegebenen Betrag ist. Ist kein Haus gefunden, kommt ein leeres Array.

Beispiel: /v1/zillow/prices?usd=300000 liefert die Häuser mit Preis 240000 (Baltimore) und 250000 (Boston). Code:

app.get('/v1/zillow/prices', (req, res) => {
  const usd = req.query.usd;
  if (!usd || isNaN(usd)) {
    return res.status(404).json({ error: 'Parameter usd fehlt oder ungültig' });
  }
  const filtered = houses.filter(h => h.price <= parseInt(usd));
  res.json(filtered);
});

Beachte: Auch hier geben wir 404 bei fehlendem oder ungültigem Parameter.

Trend-Analogie: Wie ein KI-Immobilien-Scout

Stell dir vor, du entwickelst eine KI-Immobilien-App, die für jedes Haus einen Zestimate berechnet – ähnlich wie Zillow es macht. In Zeiten von ChatGPT und Smart-Home-Assistenten sind solche APIs gefragt. Deine API könnte Teil eines größeren Systems sein, das Machine-Learning-Modelle mit Echtzeitdaten füttert. Oder du baust einen Discord-Bot, der Hauspreise abfragt – die Möglichkeiten sind endlos. Mit diesem Tutorial legst du den Grundstein für komplexere Microservices.

Fehlerbehandlung und Statuscodes

Die Aufgabenstellung verlangt, dass bei korrekten Anfragen ein 200-Statuscode zurückgegeben wird, bei fehlerhaften Anfragen (falscher Endpunkt, fehlende Parameter) ein 404. Unser Code erfüllt das. Für unbekannte Routen könntest du eine Catch-All-Middleware einbauen:

app.use((req, res) => {
  res.status(404).json({ error: 'Endpunkt nicht gefunden' });
});

Damit sind alle Anforderungen abgedeckt.

Vollständiger Code

Hier der komplette Code für zillow.js – kompakt und ohne Schnörkel:

const express = require('express');
const app = express();

const houses = [
  { price: 240000, city: "baltimore" },
  { price: 300000, city: "austin" },
  { price: 400000, city: "austin" },
  { price: 1000000, city: "seattle" },
  { price: 325000, city: "baltimore" },
  { price: 550000, city: "seattle" },
  { price: 250000, city: "boston" }
];

// Zestimate-Endpunkt
app.get('/v1/zillow/zestimate', (req, res) => {
  const { sqft, bed, bath } = req.query;
  if (!sqft || !bed || !bath || isNaN(sqft) || isNaN(bed) || isNaN(bath)) {
    return res.status(404).json({ error: 'Ungültige oder fehlende Parameter' });
  }
  const zestimate = parseInt(sqft) * parseInt(bed) * parseInt(bath) * 10;
  res.json({ zestimate });
});

// Häuser nach Stadt
app.get('/v1/zillow/houses', (req, res) => {
  const city = req.query.city;
  if (!city) {
    return res.json([]);
  }
  const filtered = houses.filter(h => h.city === city.toLowerCase());
  res.json(filtered);
});

// Häuser nach Preis
app.get('/v1/zillow/prices', (req, res) => {
  const usd = req.query.usd;
  if (!usd || isNaN(usd)) {
    return res.status(404).json({ error: 'Parameter usd fehlt oder ungültig' });
  }
  const filtered = houses.filter(h => h.price <= parseInt(usd));
  res.json(filtered);
});

// 404 für unbekannte Routen
app.use((req, res) => {
  res.status(404).json({ error: 'Endpunkt nicht gefunden' });
});

const PORT = process.argv[2] || 3000;
app.listen(PORT, () => {
  console.log(`Server läuft auf Port ${PORT}`);
});

Testen der API

Starte den Server mit node zillow.js 3000. Dann teste mit curl, Postman oder im Browser:

  • http://localhost:3000/v1/zillow/zestimate?sqft=2000&bed=3&bath=4{"zestimate":240000}
  • http://localhost:3000/v1/zillow/houses?city=baltimore → Array mit zwei Objekten
  • http://localhost:3000/v1/zillow/houses[]
  • http://localhost:3000/v1/zillow/prices?usd=300000 → zwei Häuser
  • http://localhost:3000/v1/zillow/prices → 404

Häufige Fehler vermeiden

Viele Studierende verlieren Punkte, weil sie das HTTP-Modul statt Express nutzen oder ES6-Importe verwenden. Achte darauf, dass du require('express') verwendest und nicht import. Auch die Statuscodes sind wichtig: Bei fehlenden Parametern 404, nicht 400. Und denk dran, die Portnummer aus process.argv[2] zu lesen – nicht hartcodiert.

Fazit

Mit diesem Tutorial hast du eine voll funktionsfähige Express-API für Zillow-Zestimates erstellt. Du kennst jetzt die Grundlagen von Routing, Query-Parametern und JSON-Antworten. Diese Kenntnisse sind die Basis für viele moderne Web-APIs – ob für Immobilienportale, E-Commerce oder Social-Media-Apps. Viel Erfolg bei deinem Assignment!