1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: 22747 -->
<sect1 id="zend.http.response">
<title>Zend_Http_Response</title>
<sect2 id="zend.http.response.introduction">
<title>Einführung</title>
<para>
<classname>Zend_Http_Response</classname> stellt den einfachen Zugriff auf eine
<acronym>HTTP</acronym>-Rückantwort sowie einige statische Methoden zur Analyse der
<acronym>HTTP</acronym>-Rückantworten bereit. Normalerweise wird
<classname>Zend_Http_Response</classname> als ein Objekt verwendet, das von einer
<classname>Zend_Http_Client</classname>-Anfrage zurückgegeben wurde.
</para>
<para>
In den meisten Fällen wird ein <classname>Zend_Http_Response</classname>-Objekt über die
Methode fromString() instanziert, die einen String liest, der eine
<acronym>HTTP</acronym>-Rückantwort enthält und ein
<classname>Zend_Http_Response</classname>-Objekt zurückgibt.
<example id="zend.http.response.introduction.example-1">
<title>Ein Zend_Http_Response-Objekt über die Factory-Methode instanzieren</title>
<programlisting language="php"><![CDATA[
$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);
]]></programlisting>
</example>
</para>
<para>
Man kann auch die Konstruktormethode verwenden, um ein neues Zend_Http_Response-Objekt
zu erstellen, indem man alle Parameter für die Antwort angibt:
</para>
<para>
<command>public function __construct($code, $headers, $body = null, $version = '1.1',
$message = null)</command>
</para>
<itemizedlist>
<listitem>
<para>
<varname>$code</varname>: Der <acronym>HTTP</acronym>-Antwortcode(eg. 200, 404,
etc.)
</para>
</listitem>
<listitem>
<para>
<varname>$headers</varname>: Ein assoziatives Array mit <acronym>HTTP</acronym>
Antwort Headers (z.B. 'Host' => 'example.com')
</para>
</listitem>
<listitem>
<para>
<varname>$body</varname>: Der Hauptteil der Antwort als String
</para>
</listitem>
<listitem>
<para>
<varname>$version</varname>: Der Version der <acronym>HTTP</acronym>-Antwort
(normalerweise 1.0 oder 1.1)
</para>
</listitem>
<listitem>
<para>
<varname>$message</varname>: Die <acronym>HTTP</acronym>-Rückantwort (z.B. 'OK',
'Internal Server Error'). Falls nicht angegeben, wird die Rückantwort anhand des
Antwortcode gesetzt.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="zend.http.response.testers">
<title>Boolesche Testmethoden</title>
<para>
Sobald ein <classname>Zend_Http_Response</classname>-Objekt instanziert ist, stellt es
mehrere Methoden bereit, die zum Testen des Typs der Antwort verwendet werden können.
Diese geben alle ein boolesches <constant>TRUE</constant> oder
<constant>FALSE</constant> zurück:
<itemizedlist>
<listitem>
<para>
<methodname>isSuccessful()</methodname>: Ob die Anfrage erfolgreich war oder
nicht. Gibt <constant>TRUE</constant> für <acronym>HTTP</acronym> 1xx und
2xx Antwortcodes zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>isError()</methodname>: Ob der Antwortcode auf einen Fehler
rückschließen lässt oder nicht. Gibt <constant>TRUE</constant> für
<acronym>HTTP</acronym> 4xx (Client Fehler) und 5xx (Server Fehler)
Antwortcodes zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>isRedirect()</methodname>: Ob die Antwort eine Weiterleitung ist
oder nicht. Gibt <constant>TRUE</constant> für <acronym>HTTP</acronym> 3xx
Antwortcodes zurück.
</para>
</listitem>
</itemizedlist>
<example id="zend.http.response.testers.example-1">
<title>Die Methode isError() verwenden, um eine Antwort zu validieren</title>
<programlisting language="php"><![CDATA[
if ($response->isError()) {
echo "Error transmitting data.\n"
echo "Server reply was: " . $response->getStatus() .
" " . $response->getMessage() . "\n";
}
// .. verarbeite die Antwort hier...
]]></programlisting>
</example>
</para>
</sect2>
<sect2 id="zend.http.response.acessors">
<title>Zugriffsmethoden</title>
<para>
Der Hauptzweck eines Zend_Http_Response-Objekts ist der einfache Zugriff auf diverse
Antwortparameter.
<itemizedlist>
<listitem>
<para>
<methodname>getStatus()</methodname>: Erhalte den <acronym>HTTP</acronym>
Antwortstatuscode (z.B. 200, 504, etc.) zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>getMessage()</methodname>: Erhalte die <acronym>HTTP</acronym>
Antwortstatus Meldung (z.B. "Not Found", "Authorization Required") zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>getBody()</methodname>: Erhalte den kompletten dekodierten
Hauptteil der <acronym>HTTP</acronym>-Antwort zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>getRawBody()</methodname>: Erhalte den rohen, möglicherweise
kodierten Hauptteil der <acronym>HTTP</acronym>-Antwort zurück. Wenn der
Hauptteil z.B. mittels GZIP kodiert wurde, wird er nicht dekodiert.
</para>
</listitem>
<listitem>
<para>
<methodname>getHeaders()</methodname>: Erhalte die
<acronym>HTTP</acronym>-Antwort-Header als assoziatives Array
(z.B. 'Content-type' => 'text/html') zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>getHeader($header)</methodname>: Erhalte einen spezifischen
<acronym>HTTP</acronym>-Antwort-Header zurück, der durch $header angegeben
wird.
</para>
</listitem>
<listitem>
<para>
<methodname>getHeadersAsString($status_line, $br)</methodname>:
Erhalte den kompletten Header-Satz als String zurück. Wenn
<varname>$status_line</varname> auf <constant>TRUE</constant> gesetzt ist
(Standardwert), wird die erste Statuszeile (z.B. "HTTP/1.1 200 OK")
ebenfalls zurückgegeben. Die Zeilen werden durch den <varname>$br</varname>
Parameter umgebrochen (kann z.B. "<br />" sein. Standardwert ist
"\n").
</para>
</listitem>
<listitem>
<para>
<methodname>asString($br)</methodname>: 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 <methodname>__toString()</methodname> verwenden, wenn man
das Objekt in einen String casten will. Diese wird dann auf
<methodname>asString()</methodname> weiterleiten.
</para>
</listitem>
</itemizedlist>
<example id="zend.http.response.acessors.example-1">
<title>Zend_Http_Response Zugriffsmethoden verwenden</title>
<programlisting language="php"><![CDATA[
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();
}
]]></programlisting>
</example>
<note>
<title>Immer die Rückgabewerte prüfen</title>
<para>
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.
</para>
</note>
<example id="zend.http.response.acessors.example-2">
<title>Auf Antwort-Header zugreifen</title>
<programlisting language="php"><![CDATA[
$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;
]]></programlisting>
</example>
</para>
</sect2>
<sect2 id="zend.http.response.static_parsers">
<title>Statische HTTP-Antwortanalysierer</title>
<para>
Die Klasse <classname>Zend_Http_Response</classname> beinhaltet auch verschiedene,
intern verwendete Methoden für die Verarbeitung und Analyse der
<acronym>HTTP</acronym>-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.
<itemizedlist>
<listitem>
<para>
<methodname>Zend_Http_Response::extractCode($response_str)</methodname>:
Extrahiere den <acronym>HTTP</acronym>-Antwortcode (z.B. 200 oder 404) von
<varname>$response_str</varname> und gebe ihn zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::extractMessage($response_str)</methodname>:
Extrahiere die <acronym>HTTP</acronym>-Rückantwort (z.B. "OK" oder
"File Not Found") von <varname>$response_str</varname> und gebe sie zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::extractVersion($response_str)</methodname>:
Extrahiere die <acronym>HTTP</acronym>-Version (z.B. 1.1 oder 1.0) von
<varname>$response_str</varname> und gebe sie zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::extractHeaders($response_str)</methodname>:
Extrahiere die <acronym>HTTP</acronym>-Antwort-Header von
<varname>$response_str</varname> und gebe sie in einem Array zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::extractBody($response_str)</methodname>:
Extrahiere den <acronym>HTTP</acronym>-Antworthauptteil aus
<varname>$response_str</varname> und gebe ihn zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::responseCodeAsText($code,
$http11)</methodname>: Erhalte die Standard <acronym>HTTP</acronym>
Rückantwort für einen Antwortcode $code. Zum Beispiel wird "Internal Server
Error" zurückgegeben, wenn <varname>$code</varname> gleich 500 ist. Wenn
<varname>$http11</varname> gleich <constant>TRUE</constant> ist (Standard),
werden die <acronym>HTTP</acronym>/1.1 Standardantworten zurückgegeben,
andernfalls die <acronym>HTTP</acronym>/1.0 Antworten. Wird
<varname>$code</varname> nicht angegeben, wird diese Methode alle bekannten
<acronym>HTTP</acronym>-Antwortcodes als assoziatives Array (code =>
message) zurückgeben.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Neben der Analysemethoden beinhaltet die Klasse auch einen Satz von Dekodierern für
allgemeine <acronym>HTTP</acronym>-Antwort-Transferkodierungen:
<itemizedlist>
<listitem>
<para>
<methodname>Zend_Http_Response::decodeChunkedBody($body)</methodname>:
Dekodiere einen kompletten "Content-Transfer-Encoding: Chunked" Hauptteil
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::decodeGzip($body)</methodname>: Dekodiere
einen "Content-Encoding: gzip" Hauptteil
</para>
</listitem>
<listitem>
<para>
<methodname>Zend_Http_Response::decodeDeflate($body)</methodname>: Dekodiere
einen "Content-Encoding: deflate" Hauptteil
</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
|