TigerZF
🌐Español

38.5. Zend_Http_Response

38.5.1. Introducción

Zend_Http_Response proporciona un acceso sencillo a un mensaje de respuesta HTTP, así como un conjunto de métodos estáticos para analizar mensajes de respuesta HTTP. Normalmente, Zend_Http_Response se utiliza como un objeto devuelto por una solicitud de Zend_Http_Client.

En la mayoría de los casos, un objeto Zend_Http_Response se instanciará usando el método fromString(), que lee una cadena que contiene un mensaje de respuesta HTTP, y devuelve un nuevo objeto Zend_Http_Response:

Ejemplo 38.30. Instanciación de un objeto Zend_Http_Response mediante el método de fábrica

$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);


También puede utilizar el método constructor para crear un nuevo objeto de respuesta, especificando todos los parámetros de la respuesta:

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

  • $code: El código de respuesta HTTP (por ejemplo, 200, 404, etc.)

  • $headers: Un array asociativo de cabeceras de respuesta HTTP (por ejemplo, 'Host' => 'example.com')

  • $body: El cuerpo de la respuesta como cadena de texto

  • $version: La versión de respuesta HTTP (normalmente 1.0 o 1.1)

  • $message: El mensaje de respuesta HTTP (por ejemplo 'OK', 'Internal Server Error'). Si no se especifica, el mensaje se establecerá según el código de respuesta

38.5.2. Métodos de comprobación booleanos

Una vez que se instancia un objeto Zend_Http_Response, este proporciona varios métodos que pueden utilizarse para comprobar el tipo de respuesta. Todos ellos devuelven un valor booleano TRUE o FALSE:

  • isSuccessful(): Si la solicitud fue exitosa o no. Devuelve TRUE para los códigos de respuesta HTTP 1xx y 2xx

  • isError(): Si el código de respuesta implica un error o no. Devuelve TRUE para los códigos de respuesta HTTP 4xx (errores de cliente) y 5xx (errores de servidor)

  • isRedirect(): Si la respuesta es una respuesta de redirección o no. Devuelve TRUE para los códigos de respuesta HTTP 3xx

Ejemplo 38.31. Uso del método isError() para validar una respuesta

if ($response->isError()) {
  echo "Error transmitting data.\n"
  echo "Server reply was: " . $response->getStatus() .
       " " . $response->getMessage() . "\n";
}
// .. process the response here...


38.5.3. Métodos de acceso

El objetivo principal del objeto de respuesta es proporcionar un acceso sencillo a los distintos parámetros de la respuesta.

  • getStatus(): Obtiene el código de estado de la respuesta HTTP (por ejemplo, 200, 504, etc.)

  • getMessage(): Obtiene el mensaje de estado de la respuesta HTTP (por ejemplo, "Not Found", "Authorization Required")

  • getBody(): Obtiene el cuerpo de la respuesta HTTP completamente decodificado

  • getRawBody(): Obtiene el cuerpo de la respuesta HTTP en bruto, posiblemente codificado. si el cuerpo fue decodificado usando codificación GZIP por ejemplo, no se decodificará.

  • getHeaders(): Obtiene las cabeceras de respuesta HTTP como un array asociativo (por ejemplo, 'Content-type' => 'text/html')

  • getHeader($header): Obtiene una cabecera de respuesta HTTP específica, indicada por $header

  • getHeadersAsString($status_line, $br): Obtiene el conjunto completo de cabeceras como una cadena de texto. Si $status_line es TRUE (por defecto), también se devolverá la primera línea de estado (por ejemplo, "HTTP/1.1 200 OK"). Las líneas se separan con el parámetro $br (puede ser, por ejemplo, "<br />". Por defecto "\n")

  • asString($br): Obtiene el mensaje de respuesta completo como una cadena de texto. Las líneas se separan con el parámetro $br (puede ser, por ejemplo, "<br />". Por defecto "\n"). También puede usar el método mágico __toString() al convertir el objeto en cadena. En ese caso, delegará en asString().

Ejemplo 38.32. Uso de los métodos de acceso de Zend_Http_Response

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();
}


[Note] Compruebe siempre el valor devuelto

Dado que una respuesta puede contener varias instancias de la misma cabecera, el método getHeader() y el método getHeaders() pueden devolver ya sea una única cadena de texto, o un array de cadenas para cada cabecera. Siempre debe comprobar si el valor devuelto es una cadena o un array.

Ejemplo 38.33. Acceso a las cabeceras de respuesta

$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;


38.5.4. Analizadores estáticos de respuestas HTTP

La clase Zend_Http_Response también incluye varios métodos de uso interno para procesar y analizar mensajes de respuesta HTTP. Todos estos métodos se exponen como métodos estáticos, lo que significa que pueden utilizarse externamente, incluso si no necesita instanciar un objeto de respuesta, y simplemente desea extraer una parte específica de la respuesta.

  • Zend_Http_Response::extractCode($response_str): Extrae y devuelve el código de respuesta HTTP (por ejemplo, 200 o 404) de $response_str

  • Zend_Http_Response::extractMessage($response_str): Extrae y devuelve el mensaje de respuesta HTTP (por ejemplo, "OK" o "File Not Found") de $response_str

  • Zend_Http_Response::extractVersion($response_str): Extrae y devuelve la versión HTTP (por ejemplo, 1.1 o 1.0) de $response_str

  • Zend_Http_Response::extractHeaders($response_str): Extrae y devuelve las cabeceras de respuesta HTTP de $response_str como un array

  • Zend_Http_Response::extractBody($response_str): Extrae y devuelve el cuerpo de la respuesta HTTP de $response_str

  • Zend_Http_Response::responseCodeAsText($code, $http11): Obtiene el mensaje de respuesta HTTP estándar para un código de respuesta $code. Por ejemplo, devolverá "Internal Server Error" si $code es 500. Si $http11 es TRUE (por defecto), devolverá los mensajes estándar de HTTP/1.1 - de lo contrario se devolverán los mensajes de HTTP/1.0. Si $code no se especifica, este método devolverá todos los códigos de respuesta HTTP conocidos como un array asociativo (código => mensaje).

Aparte de los métodos de análisis, la clase también incluye un conjunto de decodificadores para las codificaciones de transferencia de respuesta HTTP comunes:

  • Zend_Http_Response::decodeChunkedBody($body): Decodifica un cuerpo completo de "Content-Transfer-Encoding: Chunked"

  • Zend_Http_Response::decodeGzip($body): Decodifica un cuerpo de "Content-Encoding: gzip"

  • Zend_Http_Response::decodeDeflate($body): Decodifica un cuerpo de "Content-Encoding: deflate"