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
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. DevuelveTRUEpara los códigos de respuesta HTTP 1xx y 2xxisError(): Si el código de respuesta implica un error o no. DevuelveTRUEpara 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. DevuelveTRUEpara 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...
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 decodificadogetRawBody(): 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 $headergetHeadersAsString($status_line, $br): Obtiene el conjunto completo de cabeceras como una cadena de texto. Si$status_lineesTRUE(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á enasString().
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();
}
![]() |
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;
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_strZend_Http_Response::extractMessage($response_str): Extrae y devuelve el mensaje de respuesta HTTP (por ejemplo, "OK" o "File Not Found") de$response_strZend_Http_Response::extractVersion($response_str): Extrae y devuelve la versión HTTP (por ejemplo, 1.1 o 1.0) de$response_strZend_Http_Response::extractHeaders($response_str): Extrae y devuelve las cabeceras de respuesta HTTP de$response_strcomo un arrayZend_Http_Response::extractBody($response_str): Extrae y devuelve el cuerpo de la respuesta HTTP de$response_strZend_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$codees 500. Si$http11esTRUE(por defecto), devolverá los mensajes estándar de HTTP/1.1 - de lo contrario se devolverán los mensajes de HTTP/1.0. Si$codeno 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"
![[Note]](images/note.png)