HTTP Clients (Teil 1) – Pear HTTP_Request2 + PHP Simple HTML DOM Parser

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:

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,"
"; } $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?

5 Kommentare

  1. […] HTTP Clients (Teil 2) – Zend_Http + Zend_Dom Web Kommentare abgeben Serie: Teil 1 – Pear […]

  2. […] Clients (Teil 3) – HttpUnit Web Kommentare abgeben Serie: Teil 1 – Pear Teil 2 – […]

  3. […] Clients (Teil 4) – the Groovy way Web Kommentare abgeben Serie: Teil 1 – Pear Teil 2 – Zend Teil 3 – Java Teil 4 – […]

  4. Vielen Dank erstmal für das Script!
    Funktioniert soweit super allerdings habe ich Probleme bei der Übergabe von mehreren Variablen, kannst du mir dabei helfen??

    Ich habe es folgendermaßen probiert:
    $url=$request->getUrl()->setQueryVariable(‚q‘, ‚http client examples‘);

    ersetzt durch:
    $params = array(„q“=>“‚http client examples“, „num“=>“100“);
    $url=$request->getUrl()->setQueryVariables($params);

    Habe also versucht bei Google nicht nur 10 Ergebnisse zu bekommen sondern 100…

    Kannst du mir sagen was ich hier falsch mache??

  5. Du hast ein Hochkomma zuviel bei ”‘http client examples”. Mit ‚http client examples‘ sollte es funktionieren.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: