Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 6 HTTP
  gp 6.1 HTTP
  gp 6.2 HTTP_Header
    gp 6.2.1 Cache-Steuerung
  gp 6.3 HTTP_Request
  gp 6.4 HTTP_Download
  gp 6.5 HTTP_Upload
  gp 6.6 HTTP_Session


Rheinwerk Computing

6.3 HTTP_Request  toptop


Besprochene Version: 1.2.3 Lizenz: PHP
Klassendatei(en): HTTP/Request.php

HTTP_Request eröffnet Ihnen die spannende Möglichkeit, mithilfe von PHP Anfragen an Webserver zu verschicken und das Ergebnis der Anfrage, sprich die zurückgelieferte Datei, in einer Variable abzulegen und weiterzuverarbeiten. Diese Vorgehensweise ist z. B. dann hilfreich, wenn Sie Inhalte aus einer Webseite umformatieren wollen, bevor Sie sie darstellen oder einen RSS-Datenstrom auslesen wollen.

require_once "HTTP/Request.php"; 
// Neues Objekt mit URL instanziieren 
$req = new HTTP_Request("http://www.yahoo.de"); 
// Request an den Server schicken 
$erg=$req->sendRequest(); 
// Ist ein Fehler aufgetaucht? 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getMessage()); 
} 
else 
{ 
   echo $req->getResponseBody(); 
}

Listing 6.2 Aufruf einer URL mit HTTP_Request

In Listing 6.2 finden Sie ein sehr einfaches Beispiel für die Nutzung des Pakets. Der Konstruktor bekommt die URL übergeben, die aufgerufen werden soll. Die eigentliche Abfrage wird dann mithilfe der Methode sendRequest() zum Server geschickt. Die Antwort des Servers, also die zurückgesandten Daten, werden direkt im Objekt abgelegt und können dann mithilfe von getResponseBody() ausgelesen werden.

Allerdings wäre es problematisch, einfach jede zurückgelieferte Antwort einfach so auszugeben, da das Paket nicht automatisch einen Fehler generiert, wenn der Server z. B. den Code 404 (Datei nicht gefunden) zurückliefert. Um solche Fälle korrekt abfangen zu können, steht die Methode getResponseCode() zur Verfügung, die Ihnen den Code als Zahl zurückgibt.

// Status 200, Request erfolgreich? 
if (200 === $req->getResponseCode()) 
{ 
   echo $req->getResponseBody(); 
}

Um eine weitergehende Analyse der Antwort durchzuführen, können Sie mit getResponseHeader() die Header auslesen, die zurückgegeben wurden. Ein Aufruf ohne Parameter gibt ein assoziatives Array mit allen Headern zurück, wobei Sie sich nicht wundern sollten, dass jeder Header doppelt vorhanden ist. Der Name jedes Headers taucht einmal komplett kleingeschrieben und einmal mit großem Anfangsbuchstaben als Schlüssel auf. So finden Sie beispielsweise die Schlüssel Content-Type und content-type mit identischen Werten im Array. Da nicht jeder Server dieselben Header sendet, unterscheidet sich der Rückgabewert also von Fall zu Fall, so dass ich ihn hier nicht ausführlich erläutern kann. Der Content-Type sollte aber auf jeden Fall vorhanden sein, so dass Sie diesen Header auch auswerten können. Möchten Sie nur diesen Header auslesen, können Sie seinen Namen auch direkt an die Methode übergeben und bekommen nur seinen Wert zurück:

$type=$req->getResponseHeader('Content-Type');

Sollten Sie auf diesem Weg versuchen, den Wert eines Headers zu ermitteln, den der Server nicht zurückgegeben hat, ist der Rückgabewert der Funktion ein false.

Ein sehr interessantes Feature dieses Pakets ist die Möglichkeit, einen Formularversand zu simulieren. Das Paket ist also in der Lage, Daten an einen Server zu versenden, so dass sie für den Server so aussehen, als wären sie aus einem Formular übergeben worden. Um auf diesem Weg Daten zu versenden, müssen Sie sich zuerst entscheiden, mit welcher Methode die Daten verschickt werden. Die Methode setMethod() muss hierzu entweder mit dem Parameter HTTP_REQUEST_METHOD_POST oder mit HTTP_REQUEST_METHOD_GET aufgerufen werden. Die Daten, die versendet werden, übergeben Sie mit den Methoden addPostData() für den Versand via POST bzw. mit addQueryString() für einen Versand via GET. Beide Methoden bekommen zuerst den Namen des Feldes und dann den dazugehörigen Wert übergeben. Die Methoden kodieren die Werte automatisch, so dass Sie sich nicht darum kümmern müssen. Liegen die Werte schon URL-konform vor, übergeben Sie als dritten Parameter true, damit die Werte nicht erneut kodiert werden. Nutzen Sie die Methode POST, ist es durchaus möglich, noch zusätzlich Daten als Query-String zu übergeben. Allerdings können Sie bei Nutzung der Methode GET keine POST-Daten versenden.

Das Formular

<form method="post" action="auswertung.php"> 
   <input type="text" name="eingabe" /> 
   <input type="submit" name="abschicken" vlaue="OK" /> 
</form>

könnte mithilfe von HTTP_Request so simuliert werden:

require_once "HTTP/Request.php"; 
$req = new HTTP_Request("show.php"); 
$req->setMethod(HTTP_REQUEST_METHOD_POST); 
$req->addPostData("eingabe", "Wert"); 
$req->addPostData("abschicken", "OK"); 
$erg=$req->sendRequest();

Wenn Sie auf diesem Weg ein Formular »simulieren«, vergessen Sie bitte nicht, dass auch der Submit-Button Teil des Formulars ist und mit übertragen wird. Nicht angeklickte Checkboxen oder Gruppen von Radio-Buttons werden allerdings nicht übermittelt.

Auf diesem Weg können Sie übrigens auch sehr einfach eine Suchanfrage bei Google ausführen. In Listing 6.3 sehen Sie ein Beispiel, das bei Google nach Suchwort sucht und das Ergebnis direkt ausgibt.

require_once ('HTTP/Request.php'); 
$req = new HTTP_Request("http://www.google.de/search"); 
$req->setMethod(HTTP_REQUEST_METHOD_GET); 
$req->addQueryString("q", "Suchwort"); //Suchbegriffe 
$req->addQueryString("hl", "de"); //Sprache 
$req->addQueryString("btnG", "Google-Suche"); //Submit-Button 
$erg=$req->sendRequest(); 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getMessage()); 
} 
else 
{ 
   echo $req->getResponseBody(); 
}

Listing 6.3 Suchabfrage bei Google

Natürlich unterstützt die Klasse nicht nur den Versand von einfachen Text-Daten. Es ist auch möglich, eine Datei an einen Server zu senden. Um eine Datei mit in den Versand einzubeziehen, nutzen Sie addFile(). Die Methode bekommt den Feld-Namen, unter dem die Datei an den Server geschickt werden soll, und den Dateinamen inklusive eines etwaigen Pfades übergeben. Bedingt durch die Vorgaben des http-Protokolls ist der Versand einer Datei nur bei Nutzung der Methode POST möglich.

Mit Cookies wird in vielen Zusammenhängen gearbeitet. Teilweise dienen sie dazu, einen Warenkorb zu speichern, manchmal wird eine Session-ID in ihnen abgelegt oder Ähnliches. Somit kann es notwendig sein, dass Cookies auch entsprechend verwaltet werden. Standardmäßig übernimmt die Klasse das automatisch für Sie. Allerdings können Sie vorhandene Cookies auch mit getResponseCookies() auslesen. Die Cookies werden als indiziertes Array zurückgegeben, wobei jeder Cookie durch ein eigenes Array repräsentiert wird. Ein solches Array kann beispielsweise so aussehen wie in diesem Beispiel eines Google-Cookies:

array(6) { 
    ["expires"]=> 
    string(29) "Sun, 17-Jan-2038 19:14:07 GMT" 
    ["domain"]=> 
    string(10) ".google.de" 
    ["path"]=> 
    string(1) "/" 
    ["secure"]=> 
    bool(false) 
    ["name"]=> 
    string(4) "PREF" 
    ["value"]=> 
    string(72) "ID=d11b1a82ea7:LD=de:TM=11070:LM=170:S=z1SH6c" 
}

Sollte es notwendig sein, können Sie durch Aufruf von addCookie('name','wert') auch einen Cookie hinzufügen. Cookies sind üblicherweise dazu gedacht, Informationen von einem Seiten-Aufruf zum nächsten weiterzureichen, damit der Server Sie bzw. einen bestimmten Computer wiedererkennt. Da die Cookies auf die Lebensdauer des HTTP_Request-Objekts beschränkt sind, wären sie in diesem Fall wenig hilfreich, wenn Sie mit einem Objekt immer nur eine URL aufrufen könnten. Um für ein bestehendes Objekt eine neue URL festzulegen, steht die Methode setURL() zur Verfügung, die die aufzurufende URL übergeben bekommt. Um die Daten zu löschen, die bereits im Objekt abgelegt worden sind, stehen clearPostData() und clearCookies() zur Verfügung. Die Daten, die Sie mit addQueryString() bzw. addFile() hinzugefügt haben, werden automatisch gelöscht.

Des Weiteren unterstützt die Klasse auch die Möglichkeit, sich bei Servern zu authentifizieren bzw. eine URL über einen Proxy aufzurufen. Für die Authentifizierung steht die Methode setBasicAuth() zur Verfügung, die erst den gewünschten Benutzernamen und dann das Passwort übergeben bekommt. Die Nutzung eines Proxys ist ähnlich unproblematisch. setProxy() bekommt erst den Namen des Proxys bzw. seine IP und danach den Port übergeben. Verlangt der Proxy eine Authentifizierung, können Sie als dritten Parameter noch einen Benutzernamen und als vierten das dazugehörige Passwort angeben. Da in beiden Fällen die Authentifizierung erst beim Aufruf von sendRequest() ausgeführt wird, sollten Sie auf jeden Fall anhand des Rückgabecodes prüfen, ob die Authentifizierung funktioniert hat.

 <<   zurück
     
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: PHP PEAR
PHP PEAR
Jetzt Buch bestellen!
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Rheinwerk-Shop: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Rheinwerk-Shop: MySQL 5.6






 MySQL 5.6


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern