PHP-Programmierung – _buildRequest( )
Datenaustausch auf HTTP-Ebene
HTTP-Response ___
Liefert Ihr Server beispielsweise nicht die erwartete Antwort auf eine bestimmte Anfrage, sehen Sie sich ambesten die Bestandteile des Requests genauer an. Um einen von einem Browser auf
Ihrem Server ausgelösten HTTP-Request sowie die zugehörige HTTP-Response zu analysieren, können Sie sich für einfache Anfragen über Telnet mit dem Server verbinden und die Request-Header manuell eingeben. Folgende Kommandos sind dafür erforderlich:
% telnet www.example.com 80
Trying 10.1.1.1…
Connected to www.example.com.
Escape character is ‘^]’.
GET / HTTP/1.0
Host: www.example.com
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2002 06:10:19 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.2 mod_ssl/2.8.9 Open SSL/0.9.6d
X-Powered-By: PHP/4.2.2
Connection: close
Content-Type: text/html
// … Body der Seite …
Wenn Sie die Request-Header manuell eingeben, merkt der Server nicht,dass sie von Ihnen geschrieben und nicht von einem Browser übersendet worden sind. Allerdings haben manche Webserver einen Timeout für die Zeit, die sie auf eine Anfrage warten. Es kann daher ganz sinnvoll sein, den Request vorab zu schreiben und in Telnet einzufügen. Die erste Zeile des Requests enthält die Request-Methode (GET), ein Leerzeichen, den von Ihnen gewünschten Pfad (/), dann ein weiteres Leerzeichen und schließlich das verwendete Protokoll (HTTP/1.0).
Die nächste Zeile, der Host-Header, nennt dem Server den virtuellen Host für den Fall, dass sich
mehrere Hosts dieselbe IP-Adresse teilen. Eine leere Zeile zeigt dem Server das Ende der Anfrage an; er schickt Ihnen daraufhin dieAntwort zurück: erst die Header, dann eine Leerzeile und schließlich den Response-Body. Es kann mühsam sein, den Text in Telnet einzufügen, und es ist noch schwieriger, auf diese Weise eine Anfrage mit der POST-Methode zu starten. Wenn Sie eine Anfrage mit HTTP_Request vornehmen, können Sie die Response-Header und den Response-Body mit den Methoden getResponseHeader( ) und getResponseBody( ) ermitteln:
require ‘HTTP/Request.php’;
$r = new HTTP_Request(‘http://www.example.com/submit.php’);
$r->setMethod(HTTP_REQUEST_METHOD_POST);
$r->addPostData(‘affe’,’onkel’);
$r->sendRequest();
$response_headers = $r->getResponseHeader();
$response_body =
$r->getResponseBody();
Umeinen bestimmten Response-Header auszulesen, übergeben Sie der Funktion getResponseHeader( ) den Header-Namen.Wird die Funktion ohne Argumente aufgerufen, gibt getResponseHeader() ein Array zurück, das alle Response-Header enthält. HTTP_Request speichert den ausgehenden Request nicht in einer Variablen, aber Sie können ihn rekonstruieren, indem Sie die privateMethode _buildRequest( ) aufrufen:
require ‘HTTP/Request.php’;
$r = new HTTP_Request(‘http://www.example.com/submit.php’);
$r->setMethod(HTTP_REQUEST_METHOD_POST);
$r->addPostData(‘affe’,’onkel’);
print $r->_buildRequest();
Dann wird folgender Request ausgegeben:
POST /submit.php HTTP/1.1
User-Agent: PEAR HTTP_Request class ( http://pear.php.net/ )
Content-Type: application/x-wwwform-urlencoded
Connection: close
Host: www.example.com
Content-Length: 10
affe=onkel