Oct 16

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?

geschrieben von gklinkmann \\ tags: , , ,

Sep 14

Für alte Linux Hasen ist das ein Klax, aber da man es meist pro Computer nur einmal macht, frage ich mich jedes mal beim Aufsetzen eines Rechners mit Windows und Linux – wie war das noch?

Eigentlich ist es gar nicht so schwer. Zuerst muss man die UID’s der Windows Partitionen ermitteln:

> sudo blkid
/dev/sda2: UUID="8A4831E44831CFA5" LABEL="Volume" TYPE="ntfs"
/dev/sda5: UUID="A020173420B4E2A8" TYPE="ntfs"

dann die Verzeichnisse für die Mountpoints erstellen:

> sudo mkdir /media/windows
> sudo mkdir /media/windows/C
> sudo mkdir /media/windows/D

dann die Datei /etc/fstab ändern um die Partitionen permanent einzubinden:

> sudo vi /etc/fstab
# Zeilen hinzufügen
UUID=8A4831E44831CFA5   /media/windows/C   ntfs-3g   defaults,nls=utf8,uid=0,gid=46   0   0
UUID=A020173420B4E2A8   /media/windows/D   ntfs-3g   defaults,nls=utf8,uid=0,gid=46   0   0

Für den mount wird der ntfs-3g Treiber benutzt, der bereits Bestandteil der großen Distributionen (getestet auf Kubuntu 9.04) ist. Was noch fehlt ist das eigentliche mounten:

> sudo mount -a

Fertig.

Links:
ubuntuusers.de – Windows Partitionen einbinden

geschrieben von gklinkmann \\ tags: , , , , ,

Aug 05

amazon product advertising api logo

Die Amazon Product Advertising API (Teil der Amazon Webservices (AWS)) bietet einen Zugriff auf Amazon Produktdaten. Grundsätzlich gibt es mit SOAP und REST zwei Möglichkeiten, um auf die AWS zuzugreifen. Für die Amazon Product Advertising API wird da

Zum 15.08.2009 ändert sich das Authentifizierungsverfahren. Grund genug um den geänderten Zugriff in einem kleinen Beispiel einmal genauer zu betrachten.
Reichte früher ein API Key, sind jetzt ein öffentlicher und ein privater Zugangsschlüssel notwendig, die man während der Registrierung erstellt. Für SOAP Anfragen ist alternativ auch die Authentifizierung über X.509 Zertifikate möglich. Eine Übersicht über die s.g. “Request Identifiers” gibt es hier.

Im Beispiel soll die Klasse AmazonService die Anfrage an die Amazon Product Advertising API übernehmen. Betrachtet wird nur der Fall, wenn alles gut geht. Im produktiven Einsatz muss natürlich noch das Fehlerhandling hinzugefügt werden.
Die bei der Registrierung erstellten Zugangsschlüssel werden in der Klasse als Konstanten hinterlegt. Die Variable xml benötigen wir für die Antwort von Amazon.

1
2
3
4
5
class AmazonService {
   const APIKEY='< Euer öffentlicher Schlüssel >';
   const PRIVATE_KEY='< Euer privater Schlüssel >';
   const ASSOCIATE_TAG='< Eure Associates Tracking ID >';
   private $xml;

Das wichtigste für die Anfrage ist der Aufbau der URL. In Ihr werden die Parameter der Anfrage und die mit dem privaten Zugangsschlüssel erstellte Signatur an Amazon übergeben. Diese Aufgabe übernimmt die Funktion buildURL.
Continue reading »

geschrieben von gklinkmann \\ tags: , , ,

Oct 01

WordPress ist sehr beliebt für Blogs oder als Content Management Systeme (CMS) für kleine bis mittlere Webauftritte. Seine Beliebheit verdankt es vor allem der großen Anzahl an Plugins und Themes, die durch die Community bereitgestellt wurden, aber auch durch die Einfachheit diese anzupassen oder selbst zu erstellen.

Das Smashing Magazine hat jetzt 100 Tipps und Tricks zum Anpassen und Erweitern von WordPress in einem Beitrag zusammengefasst und wie folgt untergliedert:

1. Helpful Resources
2. WordPress Tutorials
2.1. Basics of Creating a Theme
2.2. Multiple Hints, Tips, and Tricks
2.3. Working with Categories
3.4. Navigation Menus in WordPress
2.4. WordPress as a CMS
2.5. Working with Comments
2.6. Working with Headers, Footers, and Sidebars
2.7. Web 2.0 Integration
2.8. Styling
2.9. WordPress SEO
2.10. Working with Feeds
2.11. Working with Featured Posts
2.12. Working with Custom Fields
2.13. Other Tutorials
3. Articles from the Official WordPress Codex
4. Blank Themes
5. WordPress Design Inspiration
6. Icons for Your Themes
7. Places to Distribute Free Themes You Have Developed
8. Galleries of Free Themes that Accept Submissions from Designers
9. Marketplaces to Sell Your Themes

Fazit: Wer also immer schon mal sein eigenes Theme oder Plugin schreiben oder WordPress nach eigenem Geschmack anpassen wollte, der findet hier eine ware Fülle von Resourcen und Tutorials zu diesem Thema. Die Anpassung muss man dann aber leider noch selbst machen. :-)

geschrieben von gklinkmann \\ tags: , ,

Jun 15

Nach Auswertung der Zugriffe auf meine Beiträge habe ich mich entschlossen, die Grails – Beiträge als Pages zu einem Tutorial zusammenzufassen. Den Anfang machen die Pages zum Zusammenspiel von Grails und Eclipse und zur Konfiguration der Datenbankverbindung in Grails. Die anderen werden folgen.

Für die Beiträge habe ich eine kleine Beispielapplikation geschrieben, deren Sourcecode hier komplett zur Verfügung steht.

geschrieben von gklinkmann \\ tags: , ,