全部博文(315)
分类:
2008-02-29 10:56:07
Zend_Http_Response可以容易的访问一个HTTP 响应信息,和一组解析HTTP响应包的静态方法。通常,Zend_Http_Response由一个Zend_Http_Client请求返回成一个对象。
在大多情形下,一个Zend_Http_Response对象是使用factory方法实例化。该方法读取一个包含HTTP响应信息的字符串,并返回一个新的Zend_Http_Response对象
$str = '';
$sock = fsockopen('', 80);
$req = "GET / HTTP/1.1\r\n" .
"Host: \r\n" .
"Connectoin: close\r\n" .
"\r\n";
fwrite($sock, $req);
while ($buff = fread($sock, 1024))
$str .= $sock;
$response = Zend_Http_Response::factory($str);
你也可以使用构造器方法创建一个新的response对象,通过指定所有response参数
public function __construct($code, $headers, $body = null, $version = '1.1', $message = null)
· $code
: HTTP response编码 (eg. 200, 404, etc.)
· $headers
: 一个HTTP response 报头的关联数组 (eg. 'Host' => 'example.com')
· $body
: response 实体字符串
· $version
: HTTP response版本 (usually 1.0 or 1.1)
· $message
:HTTP response 信息 (eg 'OK', 'Internal Server Error').如没指定,信息将会根据响应编码来设定
布尔Tester方法
一旦Zend_Http_Response被实例化,它提供了几个方法来测试响应的类型,他们都返回布尔true和false:
·
Boolean isSuccessful():
请求是否成功,如是
HTTP 1xx
和
2xx
回应编码,返回
TRUE
·
Boolean isError():
响应编码是否为错误,如是
HTTP 4xx
(客户端错误)和
5xx
(服务器错误)回应编码,返回
TRUE
·
Boolean isRedirect():
响应是否为一个重定向的响应如是
HTTP3xx
回应编码,返回
TRUE
if (
$response
->
isError
()) {
echo
"Error transmitting data.\n"
echo
"Server reply was: "
.
$response
->
getStatus
() .
" "
.
$response
->
getMessage
() .
"\n"
;
}
// .. process the response here...
存储器方法
Response对象的主要目的就是可以容易的访问各种不同的response参数。
· int getStatus()
: 获取 HTTP response 状态码 (eg. 200, 504, etc.)
· string getMessage()
: 获取 HTTP response 状态信息 (eg. "Not Found", "Authorization Required")
· string getBody()
: 获取整个解码的 HTTP response 实体
· string getRawBody()
: 获取原始的,可能未解码HTTP response 实体.如果实体使用GZIP 编码, 它将不会被解码
· array getHeaders()
: 获取HTTP response报头的一个关联数组(eg. 'Content-type' => 'text/html')
· string|array getHeader($header)
: 获取一个指定的HTTP response 报头,$header指定
· string getHeadersAsString($status_line = true, $br = "\n")
: 以字符串的方式获取整个报头组。如果$status_line是 true (缺省), 第一行状态(eg. "HTTP/1.1 200 OK") 也将会返回. 用$br参数断行 (Can be, for example, "
")
· string asString($br = "\n")
: 以字符串的方式获取整个response信息。用$br参数断行(Can be, for example, "
")
if (
$response
->
getStatus
() ==
200
) {
echo
"The request returned the following information:
";
echo
$response
->
getBody
();
} else {
echo
"An error occurred while fetching data:
";
echo
$response
->
getStatus
() .
": "
.
$response
->
getMessage
();
}
注意:总要检查返回值
因为一个response可能包含同样报头的几个实例,getHeader方法和getHeaders方法也许返回既可能是单个字符串,也有可能是字符串数组。所以你应该总要检查返回值是一个字符串还是数组。
$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
;
静态HTTP Response解析器
Zend_Http_Response类也提供了几个内建的方法来处理和解析HTTP response信息。这些方法都被声明成一个静态方法,这使得他们即使没有实例化一个response对象,仅仅想抽取response指定部分的时候,也可以在外部使用
· int Zend_Http_Response::extractCode($response_str)
: 从HTTP response编码(eg. 200 or 404
)
中抽取$response_str并返回Zend_Http_Response::extractMessage($response_str)
: 从HTTP response 信息(
eg. "OK" or "File Not Found")
中抽取$response_str并返回
· string Zend_Http_Response::extractVersion($response_str)
: : 从HTTP 版本(
eg. eg. 1.1 or 1.0)
中抽取$response_str并返回
· array Zend_Http_Response::extractHeaders($response_str)
: 从HTTP 响应报头中抽取$response_str并返回一个数组
· string Zend_Http_Response::extractBody($response_str)
: 从HTTP 响应实体中抽取$response_str并返回
· string Zend_Http_Response::responseCodeAsText($code = null, $http11 = true)
: 从一个response code中获取标准HTTP response信息。比如,如果$code是500将返回"Internal Server Error". 如果$http11 is true (缺省),将返回HTTP/1.1 标准信息 – 否则返回 HTTP/1.0 信息. 如果$code没有指定,该方法将返回所有HTTP响应代码为一个关联数组
除去解析方法,该类也包含了一组通用HTTP response 传输编码的解码器
· string Zend_Http_Response::decodeChunkedBody($body)
: 解码一个完全的"Content-Transfer-Encoding: Chunked" 实体
· string Zend_Http_Response::decodeGzip($body)
: 解码一个 "Content-Encoding: gzip" 实体
· string Zend_Http_Response::decodeDeflate($body)
: 解码一个"Content-Encoding: deflate" 实体