Während ich mich im ersten Teil in meiner kleinen Serie über HTTP Clients mit Pear beschäftigt habe, will ich nun im 2. Teil mein Augenmerk auf das Zend Framework richten.
Auch hier benötigt man 2 Packages zur Erledigung der Aufgabe (s. Teil 1). Das Package Zend_Http ist wie das Pear Package Http_Request2 zur reinen HTTP Kommunikation geeignet.
Mit Zend_Dom kann man das empfangene HTML zerlegen.
Ein Weg zur Lösung der Aufgabe könnte so aussehen:
0, 'timeout' => 30)); try { $response = $client->request('GET'); if (200 == $response->getStatus()) { $dom = new Zend_Dom_Query($response->getBody()); $forms = $dom->query('form'); $form=$forms->current(); $action=$form->getAttribute('action'); $client = new Zend_Http_Client($url.$action, array( 'maxredirects' => 0, 'timeout' => 30)); $client->setParameterGet('q', 'http client examples'); $response = $client->request('GET'); $dom = new Zend_Dom_Query($response->getBody()); foreach ($dom->query('a.l') as $link) { if ($link->hasAttribute('href')) { $href=$link->getAttribute('href'); $linkText=$link->textContent; echo "$linkText
"; } } } else { echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' . $response->responseCodeAsText(); } } catch (Zend_Http_Exception $e) { echo 'Error: ' . $e->getMessage(); } ?>
Der Code spricht eigentlich für sich, deswegen werde ich ihn an dieser Stelle nicht so detailliert erläutern wie noch im ersten Teil.
Der Unterschied besteht im Parsen des HTML’s. Die Methode query() (Zeilen 18 und 31) liefert nämlich kein Array, sonder ein Objekt der Klasse Zend_Dom_Query_Result zurück. Da diese Klasse die beiden Interface Countable
und Iterator
implementiert, können die Ergebnisse der Anfrage mit einer foreach
Schleife durchlaufen werden. Jeder einzelne Treffer wird über ein Objekt der Klasse DOMElement abgebildet.
Fazit:
Auch Zend bietet mit Zend_Http und Zend_Dom einen guten HTTP Client. Nutzt man in seinem Projekt bereits andere Klassen aus dem Zend Framework ist dieser Lösungsansatz empfehlenswert.
Ausblick:
In Teil 3 verlasse ich die PHP Welt und stelle mit HttpUnit einen sehr komfortablen und funktionsreichen HTTP Client für Java vor.