Die übliche Kommunikation im Internet besteht aus einer Anfrage (Request) an einen Webserver über das Protokoll HTTP und eine Antwort (Response) vom Webserver auf dem selben Weg. Die anfragenden Programme nennt man deswegen auch HTTP Clients. Die bekanntesten sind ganz klar die Browser. Aber auch eigene Programme, die so kommunizieren, fallen in diese Kategorie.
Nun muss man das Rad nicht neu erfinden. Von daher möchte ich in einer kleinen Serie ein paar Lösungen vorstellen, die die Details des HTTP Protokolls abstrahieren. Die Aufgabe ist für alle gleich:
- Aufrufen der Google Startseite
- Starten einer Suche
- Anzeige der Treffer Links ohne weitere Beschreibung
Den Anfang macht das Package HTTP_Request2 aus dem Pear Repository. HTTP_Request2 unterstützt allerdings nur die reine HTTP Kommunikation, d.h. man erhält Zugriff auf den Header mit seinen Metadaten und den Body mit dem im Normalfall versendeten HTML. Die Zerlegung des HTML’s (Parsen) ist nicht Bestandteil. Diese Aufgabe erledigt das SourceForge Projekt PHP Simple HTML DOM Parser.
Genug der vielen Worte, hier ist der Beispielcode:
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
| <?php
require_once 'HTTP/Request2.php';
require_once '../includes/simple_html_dom.php';
$html = new simple_html_dom();
$url='http://www.google.de';
$request = new HTTP_Request2($url, HTTP_Request2::METHOD_GET);
try {
$response = $request->send();
if (200 == $response->getStatus()) {
$html->load_file($url);
$forms=$html->find('form');
$form=$forms[0];
$action=$form->getAttribute('action');
$html->clear();
$request = new HTTP_Request2($url.$action, HTTP_Request2::METHOD_GET);
$url=$request->getUrl()->setQueryVariable('q', 'http client examples');
$html->load($request->send()->getBody());
foreach ($html->find('a.l') as $link) {
echo $link,"<br />";
}
$html->clear();
} else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
} catch (HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?> |
Die Zeilen 7, 8 und 10 rufen die Google Startseite auf. Der Erfolg dieser Aktion (HTTP Status 200) wird in Zeile 11 kontrolliert. Davon ausgehend, dass die Seite existiert, besorge ich mir in Zeile 13 das HTML und suche darin nach dem ersten Formular. Wichtig für die weitere Kommunikation ist die Aktion (Attribut action), die für diese Form definiert wurde.
Die URL + action + die Suchanfrage, die in Zeile 21 als Parameter dem request hinzugefügt wird, ergeben die neue Anfrage. Die Klasse Simple HTML DOM Parser kann nicht nur das HTML aus einer eigenen Anfrage zerlegen, sondern auch einen String als Quelle (Zeile 23) benutzen.
Dass was mich am meisten an Simple HTML DOM Parser begeistert, ist der Zugriff auf die HTML Elemente über die Syntax von CSS Selektoren. So wird mit a.l auf alle Links der Klasse l zugegriffen.
Danach sollte man noch ein bißchen aufräumen (Zeile 29) – fertig.
Fazit:
Das Gespann aus Pear HTTP_Request2 und PHP Simple HTML DOM Parser ist ein leistungsfähiger HTTP Client für die Skriptsprache PHP. Die einzige Voraussetztung ist eine vorhandene Pear Umgebung, die ich aber sowieso jedem PHP Programmierer empfehlen würde.
Ausblick:
Teil 2 wird sich mit dem Zend Framework beschäftigen. Artikel mit Lösungen für Java und Groovy sind geplant. Welche HTTP Clients nutzt ihr für eure funktionalen Tests oder zur Fernsteuerung von Webanwendungen?
Ähnliche Artikel:
geschrieben von gklinkmann
\\ tags: Browser, php, tutorial, Web