## Responses

Wir haben unseren Request abgeschickt und haben eine Antwort erhalten.

In den Folien vorher haben wir auch die Antwort bereits extrahiert und angezeigt.

Bisher haben wir aber nur die Funktion `await response.text()` verwendet. Sie liefert den Inhalt der Antwort als normalen String zurück.

Falls es euch damals aufgefallen ist, haben wir beim Empfang des Inhalts mittels `.text()` die Antwort mit `await` abwarten mussten.

Die Funktion liefert also ein Promise das mit dem Inhalt der Antwort des Requests zurück kommt.

Aber warum?

Das liegt daran wie die Datenübertragung funktioniert.

In dem Moment in dem der Request-Promise "erfüllt" ist, haben wir zwangsweise noch keine Daten erhalten.

Die Daten vom Body werden als Stream gespeichert. Solange die Datenübertragung noch nicht abgeschlossen ist wird der Stream weiter gefüllt.

Die Abfrage der Inhalte vom Body mittels `.text()` erwartet also, dass der Stream vollständig ist.

Blicken wir aber noch genauer auf den Zustand zwischen dem Request Promise und dem Aufruf um Inhalte zu erhalten.

Wenn wir vom Server eine Antwort erhalten, kommen die Header zuerst im Browser an.

Im Header stehen alle für den Request Relevanten Meta-Informationen.

Unter anderem ist dort auch der HTTP-Status-Code enthalten, mit dem wir den Erfolg des Requests bestimmen können.

HTTP-Statuscodes sind eine 3-Stellige Nummer zwischen 100 und 599.

Jede Nummer steht für eine andere Art von Antwort. Grob Kategorisiert werden diese im Hunderter-Bereich:

1. 100er > "Informative" Antworten
2. 200er > Erfolgreiche Antworten
3. 300er > Umleitungen / Redirects
4. 400er > Client-Fehler
5. 500er > Server-Fehler

Die am gebräuchlichsten Antworten sind:

200 > OK, 201 > Created, 204 > No Content, 301 > Moved Permanently, 304 > Not Modified, 400 > Bad Request, 401 > Unauthorized, 403 > Forbidden, 404 > Not Found, 500 > Internal Server Error

Für eine komplette Liste, kann man das Internet fragen, z.B. HTTP Cats

Zurück zur Response: Wir erhalten also in den Headern bereits den Erfolg oder Miserfolg des Requests, bevor die Daten angekommen sind.

Entsprechend wird der Request-Promise fullfiled, bevor die Daten komplett angekommen sind.

Deswegen ist `.text()` ein Promise, wir warten noch auf die Vollständigkeit der Daten.

Das Response Objekt hat aber noch weitere Informationen und Funktionen.

response.headers

In der headers-property sind alle in der Response beinhalteten Header aufgelistet.

response.ok

`true`, wenn der HTTP-Statuscode im Bereich 200 bis 299 liegt.

response.status

Der HTTP-Statuscode den der Server übermittelt hat.

response.statusText

Eine Beschreibung des Response-Codes (z.B. OK für 200)

response.text() (Promise)

Extrahiert die Antwort des Servers als "Plain-Text"

response.json() (Promise)

Extrahiert die Antwort des Servers als JSON-Struktur und parsed die sofort in ein JavaScript-Objekt um.

Weitere Extraktoren:

- .formData() zur Extraktion der Antwort als FormData Objekt
- .blob() zur Extraktion der Antwort als Blob
- .arrayBuffer() zur Extraktion der Antwort als ArrayBuffer
- .bytes() zur Extraktion der Antwort in ein Uint8Array