Verteilte Systeme
Prof. Dr. Alexandra Mikityuk
HTW Berlin
PUT idempotent ist und POST nicht â und wann ihr welches nutztEgal was ihr in den letzten Wochen gebaut habt â unter der Haube lief immer HTTP.
Jeder Aufruf an Claude, GPT oder Gemini ist ein HTTP POST an einen REST-Endpoint. Der Agent macht nichts magisches â er schickt JSON ĂŒber HTTP.
Bitcoin-Wallets reden mit Nodes per JSON-RPC ĂŒber HTTP. Block Explorers, Exchange-APIs, Mempool-Daten â alles HTTP.
Browser laden Webseiten per HTTP. Smart-Home-GerÀte konfigurieren sich per REST. Sogar Drucker haben HTTP-APIs.
Tim Berners-Lee, 1989 am CERN. Drei Erfindungen â und das Internet wurde klickbar.
Uniform Resource Identifier
Einheitliche Namensgebung und Lokalisierung von Ressourcen.
https://htw-berlin.de/...
Hyper Text Transfer Protocol
Zustandsloses Protokoll fĂŒr den Datenaustausch zwischen Client und Server.
GET /index.html HTTP/1.1
Hyper Text Markup Language
Textauszeichnungssprache zur Darstellung der Inhalte und fĂŒr Hyperlinks.
<a href="...">Link</a>
Eine URI hat vier Teile (RFC 3986). Beispiel:
?)
http, https, ftp...)/ getrennte Segmentekey=value-Paare, mit & verbundenURI ist der Oberbegriff. Zwei Geschmacksrichtungen:
https://htw-berlin.de/infourn:isbn:978-3-86680-192-9Praxis: HTTP und ihr arbeitet ausschlieĂlich mit URLs. URN ist nur Theorie-Vokabular â mĂŒsst ihr nicht aktiv nutzen, hilft nur zu verstehen, was âURI" eigentlich umfasst.
HTTP ist ein Request/Response-Protokoll. Client fragt, Server antwortet. Mehr nicht.
Jeder Request hat eine Methode. Sie sagt dem Server, was mit der Ressource passieren soll.
| Methode | Bedeutung | Body? |
|---|---|---|
| GET | Ressource abrufen (lesen). HĂ€ufigste Methode. | Nein |
| HEAD | Wie GET, aber nur Header â keine Daten. Z. B. zum Cachen prĂŒfen. | Nein |
| POST | Daten an Server schicken â typisch: neue Ressource erzeugen. | Ja |
| PUT | Ressource an dieser URI vollstÀndig setzen/ersetzen. | Ja |
| PATCH | Ressource teilweise aktualisieren. | Ja |
| DELETE | Ressource an dieser URI löschen. | Nein |
| OPTIONS | Welche Methoden unterstĂŒtzt der Server fĂŒr diese URI? | Nein |
HTTP-Methoden sind eine Empfehlung, kein Zwang. Was passiert, hĂ€ngt von drei Akteuren ab â und genau hier lauert die Falle.
Sagt: âGET sollte lesen, nichts Ă€ndern."
Aber: das ist nur eine Empfehlung. HTTP erzwingt nichts.
Programmiert fĂŒr jede URL, was wirklich passiert.
Euer Code könnte bei GET auch löschen â technisch erlaubt.
Browser, Crawler, Prefetcher vertrauen: GET ist sicher.
Sie rufen GET-Links einfach auf â ohne zu fragen.
Naiver Admin-Lösch-Link:
<a href="/delete?id=42">Löschen</a>
Server-Code: âGET auf /delete?id=42 â lösche Kommentar 42."
Admin-Klick = passt. Aber wer ruft die URL noch auf, ohne zu fragen?
Die stillen Mit-Klicker:
2005: Googles Web Accelerator rief Admin-Links vorab ab, um sie zu cachen â Kommentare verschwanden weltweit, ohne dass jemand âLöschen" geklickt hatte.
GET muss sicher sein â keine Seiteneffekte. VerĂ€ndern oder Löschen â POST / PUT / DELETE.
Jede Response beginnt mit einer Zahl. Die erste Ziffer sagt euch sofort, was passiert ist.
4XX = du hast was falsch gemacht (Client-Fehler). 5XX = der Server hat ein Problem.
Drei Teile: Startzeile + Header + optionaler Body. Header und Body sind durch eine Leerzeile getrennt.
GET /people/detail/965/ HTTP/1.1
Host: www.htw-berlin.de
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xml
Accept-Language: de-de
Cookie: session=abc123...
Connection: keep-alive
(bei POST/PUT: hier kommt der Body)
HTTP/1.1 200 OK
Date: Sun, 07 Jun 2026 11:32:22 GMT
Server: nginx/1.24
Set-Cookie: session=xyz789; path=/
Content-Type: text/html;charset=utf-8
Content-Length: 1842
<!DOCTYPE html>
<html>...</html>
application/json â JSON parsen. image/png â als Bild anzeigen. Stammt aus dem E-Mail-Standard MIME (RFC 2045).
Was passiert, wenn ihr www.heise.de in den Browser tippt?
www.heise.de?" â DNS-Server antwortet: 193.99.144.85193.99.144.85:80 auf (bei HTTPS: Port 443)GET / HTTP/1.1\nHost: www.heise.deSoll der Server sich merken, wer du bist? Beide Wege haben Vor- und Nachteile.
Der Server speichert eine Session fĂŒr jeden Client. Logische Verbindung ĂŒber mehrere Anfragen hinweg.
Vorteile: performant (Daten im RAM), einfache App-Logik.
Nachteile: Skalierung schwer (Session-Sync zwischen Servern), verwaiste Sessions.
Beispiele: SMTP (E-Mail), SSH, FTP, Distributed File Systems.
Der Server speichert nichts. Jeder Request bringt alle nötigen Infos mit.
Vorteile: einfache Recovery (Crash? â Retry), horizontale Skalierung (load balancing), Caching möglich.
Nachteile: lÀngere Nachrichten (Overhead), Anwendungslogik aufwendiger.
Beispiele: HTTP (und damit REST).
Aber Login, Warenkorb, Personalisierung brauchen doch Zustand. Die Lösung: der Client speichert ihn.
Set-Cookie: session_id=abc123; path=/Cookie: session_id=abc123session_id macht (DB-Lookup, JWT prĂŒfen, ...) ist Server-interne Sache.
Authorization: Bearer <jwt-token> als Alternative fĂŒr moderne APIs (Claude, GitHub, ...).
HTTP war nicht das erste, nicht das beste Protokoll. Es ist aus folgenden GrĂŒnden Standard geworden:
Port 80 (HTTP) und 443 (HTTPS) sind ĂŒberall offen. Eigene Protokolle scheitern an Corporate-Firewalls â HTTP kommt durch.
HTTP-Server (nginx, Apache, Caddy) sind hochoptimiert. Millionen Requests/Sek. Caching, Load Balancing, CDNs â alles built-in.
SOAP, gRPC, GraphQL, JSON-RPC, Video-Streaming â alle verstecken sich in HTTP. âIf in doubt, tunnel through HTTP."
HTTPS = HTTP ĂŒber TLS. VerschlĂŒsselung, DatenintegritĂ€t, Authentifikation. Heute Standard â http:// Seiten warnt jeder Browser.
Eine HTTP-Nachricht ist klein. Aber jede TCP-Verbindung kostet einen 3-way Handshake (drei Pakete zum Aufbau: SYN â SYN-ACK â ACK) â bei 50 Requests pro Webseite ist das viel Latenz.
OK fĂŒr 1 Doc, schlecht fĂŒrs moderne Web.
Connection: keep-alive HeaderTCP-Stack lernt die Verbindung kennen â kann verlorene Pakete schneller erneut senden.
Die Semantik (Methoden, Status-Codes) bleibt gleich â das, was wir heute lernen, gilt fĂŒr alle Versionen.
Warum jede Anfrage an den Origin-Server schicken, wenn sich der Inhalt gar nicht geÀndert hat?
Lokal auf deinem Rechner. Bilder, CSS, JS â schon auf der Platte? Direkt anzeigen. Cache-Control Header steuern wie lange.
Im Firmen- oder ISP-Netz. Spart Traffic. Heute weniger wichtig, weil HTTPS-Inhalte fĂŒr Proxies opak sind.
Content Delivery Network (Akamai, Cloudflare, Fastly). Server weltweit verteilt. User aus Berlin â Server in Frankfurt. Niedrige Latenz, weniger Last auf Origin.
304 Not Modified: Browser fragt den Server âhat sich die Ressource seit Datum X geĂ€ndert?" â wenn nicht, antwortet der Server mit 304 (kein Body!) und der Browser nimmt seine lokale Kopie. Schnell & sparsam.
Jede HTTP-Komponente spielt eine dieser drei Rollen â manchmal sogar mehrere gleichzeitig.
Schickt Requests, empfÀngt Responses, wertet sie aus.
Beispiele: Browser, Smartphone-App, Python-Skript mit requests, curl, Crawler.
EmpfÀngt Requests, schickt Responses. Liefert vorgefertigte oder dynamisch generierte Inhalte.
Beispiele: nginx, Apache, Caddy, Node.js-App, FastAPI, Django, Flask.
Server gegenĂŒber dem Client, Client gegenĂŒber dem Server. âSteht in der Mitte."
Funktionen: Caching, Logging, Anonymisierung, Access Control, Transcoding, TLS-Termination.
HTTP ist ein Protokoll. REST ist eine Idee, wie man HTTP elegant nutzt, um APIs zu bauen.
Roy Fielding (einer der HTTP-Autoren!) schrieb 2000 seine Doktorarbeit: âArchitectural Styles and the Design of Network-based Software Architectures".
Er beschrieb darin den Architektur-Stil REST â REpresentational State Transfer. Die Idee: nutzt HTTP wie es gemeint war, statt eigene RPC-Protokolle daraufzubasteln.
DomÀnen-spezifische Methoden: getProductPrice(id), setUserEmail(id, email). XML-Pakete, WSDL-Definitionen, kompliziert.
Universelle Verben (GET, POST, PUT, DELETE) auf Ressourcen via URI. Leichtgewichtig, JSON-Antwort, jeder versteht's.
In REST denkt ihr nicht in âFunktionen", sondern in Ressourcen â Dinge, die eine eigene URI haben.
/users/42, /orders/2026-07-12, /messages| Aktion | HTTP | Beispiel |
|---|---|---|
| Create | POST | POST /users (mit Body) |
| Read | GET | GET /users/42 |
| Update | PUT / PATCH | PUT /users/42 (mit neuem Body) |
| Delete | DELETE | DELETE /users/42 |
Beide Àndern Daten am Server. Aber sie unterscheiden sich in einer wichtigen Eigenschaft:
âSetze die Ressource an dieser URI auf genau diesen Wert."
PUT /users/42 HTTP/1.1
Content-Type: application/json
{"name": "Alex", "age": 29}
Idempotent: egal ob ihr das 1Ă oder 100Ă schickt â das Ergebnis ist dasselbe. User 42 hat danach Name âAlex".
âErzeuge eine neue Ressource unter dieser URI" (Child-Ressource).
POST /users HTTP/1.1
Content-Type: application/json
{"name": "Alex"}
Nicht idempotent: 5Ă schicken â 5 verschiedene User. Server vergibt jedes Mal eine neue ID.
REST-APIs liefern fast immer JSON. Hier eine typische Interaktion:
GET /api/users/42 HTTP/1.1
Host: api.htw-berlin.de
Accept: application/json
Authorization: Bearer eyJhbGc...
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 42,
"name": "Alex",
"role": "student"
}
Bisher abstrakt â jetzt konkret. Wir nutzen httpbin.org: ein Echo-Server, der euch zurĂŒckspiegelt, was ihr schickt â perfekt zum Lernen.
curl# GET-Request mit Query-Parameter
$ curl "https://httpbin.org/get?name=alex"
# Antwort vom Server (JSON):
{
"args": {"name": "alex"},
"url": "https://httpbin.org/get?..."
}
Was passiert hier â Schritt fĂŒr Schritt:
curl liest die URL und baut intern einen HTTP-GET-RequestGET /get?name=alex HTTP/1.1curl = der Standard zum HTTP-Debugging. Auf jedem Mac/Linux schon dabei.
requestsimport requests
response = requests.get(
"https://httpbin.org/get",
params={"name": "alex"}
)
# Status und Body lesen
print(response.status_code) # 200
data = response.json()
print(data["args"]) # {'name': 'alex'}
Was passiert hier â Schritt fĂŒr Schritt:
requests.get(url, params={...}) â Library baut + schickt den Requestparams= wird automatisch URL-encoded (z.B. Leerzeichen â %20)response.status_code = die 200response.json() = JSON-Body â Python-Dictpip install requests â Standard-Library fĂŒr HTTP in Python.
Erinnert ihr euch an die letzten VLs? Schaut, was wirklich passiert ist:
POST /v1/messages HTTP/1.1
Host: api.anthropic.com
Authorization: Bearer sk-ant-...
Content-Type: application/json
{
"model": "claude-opus-4-7",
"messages": [...]
}
Ihr habt einen REST-Endpoint aufgerufen â mehr nicht.
POST / HTTP/1.1
Host: bitcoin-node:8332
Content-Type: application/json
{
"method": "getblockchaininfo",
"params": []
}
JSON-RPC ist auch nur POST + JSON.
REST hat keine eingebauten Sicherheitsfeatures. Das ist Absicht â Sicherheit kommt von auĂen.
Immer TLS nutzen. https:// verschlĂŒsselt Headers, Body, alles. Ohne TLS sind eure Tokens im Klartext im Netz.
Klassisch: Username/Passwort + Session-Cookie. Modern: Token im Authorization-Header (z.B. JWT oder OAuth2 Bearer Tokens).
Pro Endpoint prĂŒfen: darf dieser User auf diese Ressource? Klassisch: Rollen (RBAC). Modern: feingranulare Policies, Scopes.
Wo ihr tiefer einsteigen könnt:
Fragen?
Prof. Dr. Alexandra Mikityuk
HTW Berlin · BĂŒro Raum 308
Tel +49 30 5019-2664
NĂ€chste Woche: MQTT & Publish/Subscribe â die andere HĂ€lfte der verteilten Kommunikation