Back

Was steckt in einer HTTP-Response?

Was steckt in einer HTTP-Response?

Jedes Mal, wenn Ihr Browser eine Seite lädt oder Ihr JavaScript fetch() aufruft, sendet ein Server eine HTTP-Response zurück. Sie sehen das Ergebnis – eine gerenderte Seite, einige JSON-Daten, eine Fehlermeldung – aber die Response selbst enthält mehr Struktur, als den meisten Entwicklern bewusst ist. Das Verständnis dieser Struktur gibt Ihnen ein klareres mentales Modell beim Debugging in den DevTools oder bei der Verarbeitung von Responses im Code.

Eine HTTP-Response besteht aus drei Teilen: einer Statuszeile, Headern und einem optionalen Body.

Wichtigste Erkenntnisse

  • Jede HTTP-Response besteht aus drei Teilen: einer Statuszeile (oder einem :status-Pseudo-Header in HTTP/2 und HTTP/3), Headern und einem optionalen Body.
  • Statuscodes sind nach ihrer ersten Ziffer gruppiert – 2xx für Erfolg, 3xx für Weiterleitung, 4xx für Client-Fehler und 5xx für Server-Fehler.
  • Response-Header steuern Caching, Sicherheit, Cookies und die Interpretation von Inhalten – sie teilen dem Browser mit, wie die Payload zu handhaben ist, nicht nur was sie ist.
  • Nicht alle Response-Header sind für Frontend-JavaScript bei Cross-Origin-Requests zugänglich. Server müssen Access-Control-Expose-Headers verwenden, um den Zugriff über das standardmäßige sichere Set hinaus zu ermöglichen.

Die Anatomie einer HTTP-Response: Status, Header, Body

Die Statuszeile

In HTTP/1.1 beginnt die Response mit einer einzigen Statuszeile:

HTTP/1.1 200 OK

Diese Zeile enthält die Protokollversion, einen dreistelligen Statuscode und eine menschenlesbare Reason-Phrase. Die Reason-Phrase dient nur zur Information – der Statuscode ist das, worauf Browser und Clients tatsächlich reagieren.

HTTP-Statuscodes sind nach ihrer ersten Ziffer gruppiert:

BereichBedeutung
1xxInformativ (Anfrage empfangen, Verarbeitung läuft)
2xxErfolg (200 OK, 201 Created, 204 No Content)
3xxWeiterleitung (301 Moved Permanently, 304 Not Modified)
4xxClient-Fehler (400 Bad Request, 401 Unauthorized, 404 Not Found)
5xxServer-Fehler (500 Internal Server Error, 503 Service Unavailable)

Ein Hinweis zu HTTP/2 und HTTP/3: Die oben gezeigte textuelle Statuszeile ist spezifisch für das HTTP/1.1-Wire-Format. In HTTP/2 und HTTP/3 gibt es keine Statuszeile. Stattdessen wird der Status über einen :status-Pseudo-Header übermittelt (z. B. :status: 200). Die Semantik ist identisch – der Statuscode bedeutet dasselbe – aber die Darstellung unterscheidet sich. Die DevTools normalisieren die Darstellung, sodass Sie den vertrauten Statuscode unabhängig von der Protokollversion sehen.


HTTP-Response-Header: Was sie tatsächlich tun

Response-Header sind Metadaten. Sie teilen dem Browser mit, wie die Response zu handhaben ist, nicht was der Inhalt ist. Jeder Header ist ein case-insensitiver Name, gefolgt von einem Doppelpunkt und einem Wert.

Hier sind die Kategorien, denen Sie am häufigsten begegnen werden:

Content-Metadaten

  • Content-Type: application/json; charset=utf-8 – teilt dem Browser mit, in welchem Format der Body vorliegt und wie er zu dekodieren ist.
  • Content-Length: 1024 – die Größe des Body in Bytes.

Caching

  • Cache-Control: max-age=3600, public – weist den Browser und CDNs an, wie lange die Response gecacht werden soll.
  • ETag: "abc123" – ein Fingerabdruck der Ressource, der für bedingte Anfragen verwendet wird. Wenn sich die Ressource nicht geändert hat, gibt der Server 304 Not Modified anstelle des vollständigen Body zurück.

Sicherheit

  • Content-Security-Policy – beschränkt, aus welchen Quellen der Browser Skripte, Styles und andere Ressourcen laden kann.
  • Strict-Transport-Security – teilt dem Browser mit, dass er für eine bestimmte Dauer nur über HTTPS verbinden soll.

Cookies

  • Set-Cookie: session=xyz; HttpOnly; Secure – weist den Browser an, ein Cookie zu speichern. Eine einzelne Response kann mehrere Set-Cookie-Header enthalten, einen pro Cookie.

Eine wichtige Einschränkung: Nicht alle Response-Header sind für Frontend-JavaScript zugänglich. Standardmäßig macht die Fetch API nur einen kleinen Satz „sicherer” Header aus Cross-Origin-Responses verfügbar. Server müssen zusätzliche Header explizit in Access-Control-Expose-Headers auflisten, damit Ihr JavaScript sie lesen kann.


Der Response-Body

Der Body ist die eigentliche Payload – HTML, JSON, ein Bild, eine Datei. Nicht jede Response hat einen. Eine 204 No Content- oder 304 Not Modified-Response lässt den Body absichtlich weg. In diesen Fällen ist der Statuscode selbst die Nachricht.

Der Content-Type-Header teilt dem Browser mit, wie er interpretieren soll, was im Body ankommt.


Weniger bekannte Features, die Sie kennen sollten

HTTP-Responses können auch informative Responses wie 103 Early Hints enthalten, die es Servern ermöglichen, Ressourcen zum Vorladen vorzuschlagen, bevor die Haupt-Response eintrifft. Trailers – Header, die nach dem Body gesendet werden – existieren in HTTP/1.1 (mit Chunked Transfer Encoding) und in HTTP/2 und HTTP/3 als Trailing Headers, werden aber in der alltäglichen Frontend-Arbeit selten angetroffen. Diese sind wissenswert, aber Sie werden sie in den DevTools nicht oft sehen.


Fazit

Stellen Sie sich eine HTTP-Response wie einen Briefumschlag vor. Der Statuscode sagt Ihnen, ob die Zustellung erfolgreich war. Die Header sind Anweisungen auf der Außenseite – Vorsicht zerbrechlich, nach dem Öffnen kühlen, läuft in 24 Stunden ab. Der Body ist das, was drin ist. Wenn etwas nicht funktioniert, prüfen Sie zuerst den Statuscode, dann die Header – sie sagen Ihnen normalerweise genau, was schiefgelaufen ist und was als Nächstes zu tun ist.

FAQs

Content-Length gibt die exakte Größe des Response-Body in Bytes an. Transfer-Encoding, typischerweise auf chunked gesetzt, bedeutet, dass der Body in Teilen ohne eine vorher festgelegte Gesamtgröße gesendet wird. In HTTP/1.1 verwendet eine Response das eine oder das andere. Chunked Encoding ist üblich für dynamisch generierte Inhalte, bei denen der Server die endgültige Größe im Voraus nicht kennt.

Bei Cross-Origin-Requests macht die Fetch API standardmäßig nur einen begrenzten Satz von CORS-safelisted Response-Headern verfügbar. Dazu gehören Cache-Control, Content-Language, Content-Type, Expires, Last-Modified und Pragma. Um auf jeden anderen Header von JavaScript aus zuzugreifen, muss der Server ihn im Access-Control-Expose-Headers Response-Header aufführen.

Verwenden Sie 204 No Content, wenn der Server eine Anfrage erfolgreich verarbeitet, aber keinen Body zurückgeben muss. Dies ist üblich bei DELETE-Operationen oder Formularübermittlungen, bei denen der Client keine aktualisierten Daten als Antwort benötigt. Ein 200 OK ist angemessener, wenn Sie eine Bestätigungs-Payload oder eine aktualisierte Ressource an den Client zurücksenden möchten.

Öffnen Sie die DevTools mit F12 oder Strg+Umschalt+I, gehen Sie zum Network-Tab und klicken Sie auf eine beliebige Anfrage in der Liste. Das Headers-Panel zeigt sowohl Request- als auch Response-Header. Sie können auch nach Request-Typ filtern und nach bestimmten Header-Namen suchen. Der Response-Tab zeigt den rohen Body-Inhalt, der vom Server zurückgegeben wurde.

Gain control over your UX

See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay