# Zend_Http_Response

## Einführung

`Zend_Http_Response` stellt den einfachen Zugriff auf eine HTTP-Rückantwort sowie einige statische Methoden zur Analyse der HTTP-Rückantworten bereit. Normalerweise wird `Zend_Http_Response` als ein Objekt verwendet, das von einer `Zend_Http_Client`-Anfrage zurückgegeben wurde.

In den meisten Fällen wird ein `Zend_Http_Response`-Objekt über die Methode fromString() instanziert, die einen String liest, der eine HTTP-Rückantwort enthält und ein `Zend_Http_Response`-Objekt zurückgibt.

### Ein Zend_Http_Response-Objekt über die Factory-Methode instanzieren

    $str = '';
    $sock = fsockopen('www.example.com', 80);
    $req =     "GET / HTTP/1.1\r\n" .
            "Host: www.example.com\r\n" .
            "Connection: close\r\n" .
            "\r\n";

    fwrite($sock, $req);
    while ($buff = fread($sock, 1024))
        $str .= $sock;

    $response = Zend_Http_Response::fromString($str);

Man kann auch die Konstruktormethode verwenden, um ein neues Zend_Http_Response-Objekt zu erstellen, indem man alle Parameter für die Antwort angibt:

`public function __construct($code, $headers, $body = null, $version = '1.1', $message = null)`

- `$code`: Der HTTP-Antwortcode(eg. 200, 404, etc.)

- `$headers`: Ein assoziatives Array mit HTTP Antwort Headers (z.B. 'Host' => 'example.com')

- `$body`: Der Hauptteil der Antwort als String

- `$version`: Der Version der HTTP-Antwort (normalerweise 1.0 oder 1.1)

- `$message`: Die HTTP-Rückantwort (z.B. 'OK', 'Internal Server Error'). Falls nicht angegeben, wird die Rückantwort anhand des Antwortcode gesetzt.

## Boolesche Testmethoden

Sobald ein `Zend_Http_Response`-Objekt instanziert ist, stellt es mehrere Methoden bereit, die zum Testen des Typs der Antwort verwendet werden können. Diese geben alle ein boolesches `TRUE` oder `FALSE` zurück:

- `isSuccessful()`: Ob die Anfrage erfolgreich war oder nicht. Gibt `TRUE` für HTTP 1xx und 2xx Antwortcodes zurück.

- `isError()`: Ob der Antwortcode auf einen Fehler rückschließen lässt oder nicht. Gibt `TRUE` für HTTP 4xx (Client Fehler) und 5xx (Server Fehler) Antwortcodes zurück.

- `isRedirect()`: Ob die Antwort eine Weiterleitung ist oder nicht. Gibt `TRUE` für HTTP 3xx Antwortcodes zurück.

### Die Methode isError() verwenden, um eine Antwort zu validieren

    if ($response->isError()) {
      echo "Error transmitting data.\n"
      echo "Server reply was: " . $response->getStatus() .
           " " . $response->getMessage() . "\n";
    }
    // .. verarbeite die Antwort hier...

## Zugriffsmethoden

Der Hauptzweck eines Zend_Http_Response-Objekts ist der einfache Zugriff auf diverse Antwortparameter.

- `getStatus()`: Erhalte den HTTP Antwortstatuscode (z.B. 200, 504, etc.) zurück.

- `getMessage()`: Erhalte die HTTP Antwortstatus Meldung (z.B. "Not Found", "Authorization Required") zurück.

- `getBody()`: Erhalte den kompletten dekodierten Hauptteil der HTTP-Antwort zurück.

- `getRawBody()`: Erhalte den rohen, möglicherweise kodierten Hauptteil der HTTP-Antwort zurück. Wenn der Hauptteil z.B. mittels GZIP kodiert wurde, wird er nicht dekodiert.

- `getHeaders()`: Erhalte die HTTP-Antwort-Header als assoziatives Array (z.B. 'Content-type' => 'text/html') zurück.

- `getHeader($header)`: Erhalte einen spezifischen HTTP-Antwort-Header zurück, der durch $header angegeben wird.

- `getHeadersAsString($status_line, $br)`: Erhalte den kompletten Header-Satz als String zurück. Wenn `$status_line` auf `TRUE` gesetzt ist (Standardwert), wird die erste Statuszeile (z.B. "HTTP/1.1 200 OK") ebenfalls zurückgegeben. Die Zeilen werden durch den `$br` Parameter umgebrochen (kann z.B. "<br />" sein. Standardwert ist "\n").

- `asString($br)`: Erhalte die komplette Rückantwort als String zurück. Die Zeilen werden durch den Parameter $br umgebrochen (kann z.B. "<br />" sein. Standardwert ist "\n"). Man kann auch die magische Methode `__toString()` verwenden, wenn man das Objekt in einen String casten will. Diese wird dann auf `asString()` weiterleiten.

### Zend_Http_Response Zugriffsmethoden verwenden

    if ($response->getStatus() == 200) {
      echo "The request returned the following information:<br />";
      echo $response->getBody();
    } else {
      echo "An error occurred while fetching data:<br />";
      echo $response->getStatus() . ": " . $response->getMessage();
    }

### Immer die Rückgabewerte prüfen

Weil eine Antwort mehrere Instanzen desselben Headers beinhalten kann, können die Methoden getHeader() und getHeaders() entweder einen einzelnen String oder ein Array mit Strings für jeden Header zurückgeben. Man sollte immer prüfen, ob der Rückgabewert ein String oder ein Array ist.

### Auf Antwort-Header zugreifen

    $ctype = $response->getHeader('Content-type');
    if (is_array($ctype)) $ctype = $ctype[0];

    $body = $response->getBody();
    if ($ctype == 'text/html' || $ctype == 'text/xml') {
      $body = htmlentities($body);
    }

    echo $body;

## Statische HTTP-Antwortanalysierer

Die Klasse `Zend_Http_Response` beinhaltet auch verschiedene, intern verwendete Methoden für die Verarbeitung und Analyse der HTTP-Rückantworten. Diese Methoden sind alle als statische Methoden eingerichtet, so dass man sie extern verwenden kann, ohne dass man ein Zend_Http_Response-Objekt instanzieren muss und nur einen bestimmten Teil der Antwort extrahieren möchte.

- `Zend_Http_Response::extractCode($response_str)`: Extrahiere den HTTP-Antwortcode (z.B. 200 oder 404) von `$response_str` und gebe ihn zurück.

- `Zend_Http_Response::extractMessage($response_str)`: Extrahiere die HTTP-Rückantwort (z.B. "OK" oder "File Not Found") von `$response_str` und gebe sie zurück.

- `Zend_Http_Response::extractVersion($response_str)`: Extrahiere die HTTP-Version (z.B. 1.1 oder 1.0) von `$response_str` und gebe sie zurück.

- `Zend_Http_Response::extractHeaders($response_str)`: Extrahiere die HTTP-Antwort-Header von `$response_str` und gebe sie in einem Array zurück.

- `Zend_Http_Response::extractBody($response_str)`: Extrahiere den HTTP-Antworthauptteil aus `$response_str` und gebe ihn zurück.

- `Zend_Http_Response::responseCodeAsText($code, $http11)`: Erhalte die Standard HTTP Rückantwort für einen Antwortcode $code. Zum Beispiel wird "Internal Server Error" zurückgegeben, wenn `$code` gleich 500 ist. Wenn `$http11` gleich `TRUE` ist (Standard), werden die HTTP/1.1 Standardantworten zurückgegeben, andernfalls die HTTP/1.0 Antworten. Wird `$code` nicht angegeben, wird diese Methode alle bekannten HTTP-Antwortcodes als assoziatives Array (code => message) zurückgeben.

Neben der Analysemethoden beinhaltet die Klasse auch einen Satz von Dekodierern für allgemeine HTTP-Antwort-Transferkodierungen:

- `Zend_Http_Response::decodeChunkedBody($body)`: Dekodiere einen kompletten "Content-Transfer-Encoding: Chunked" Hauptteil

- `Zend_Http_Response::decodeGzip($body)`: Dekodiere einen "Content-Encoding: gzip" Hauptteil

- `Zend_Http_Response::decodeDeflate($body)`: Dekodiere einen "Content-Encoding: deflate" Hauptteil