Der Rück-, Ein- und Ausblick auf das PHP Extension and Application Repository

PEARcing: Neues in HTTP_Request2
Kommentare

Die stabile Version von HTTP_Request2 steht vor der Tür. Es wird daher Zeit, einen Blick auf das Package zu werfen. Lesen Sie in der folgenden kurzen Skizze, was sich im Vergleich zum alten HTTP_Request ändert und was neu hinzukommt.

Grundsätzlich hat sich die Grundidee hinter dem Package nicht verändert: komfortabel eine HTTP-Anfrage absenden, um eine Webseite zu erhalten oder einen Web Service aufzurufen. Das neue HTTP_Request2 entstand zum einen aus dem Wunsch heraus, PHP 5 besser zu nutzen, zum anderen, um eine Reihe von Problemen anzugehen, die mit modernen Programmier- und insbesondere Testkonzepten einhergehen – Stichwort Unit Tests. Als Folge daraus unterscheidet sich die Anwendung des Package in einigen Fällen deutlich vom Vorgänger. Ein Wechsel ist aber unumgänglich. Die aktive Entwicklung von HTTP_Request wurde bereits eingestellt, und mit Patches ist nicht mehr zu rechnen. Im Folgenden werden im Überblick die wichtigsten Änderungen und Neuerungen aufgeführt.

Initialisierung

Der Konstruktor hat sich nicht wesentlich verändert, allerdings kann nun die Request-Methode schon gesetzt werden:

$request = new HTTP_Request2('http://example.com/', HTTP_Request2::METHOD_GET, $configArray);

Das war die gute Nachricht. Die schlechte Nachricht ist: die Konfigurationsparameter für $configArray haben zum Teil neue Namen. Eines der früheren Ärgernisse war die unterschiedliche Syntax der Parameternamen: allowRedirects vs. proxy_host zum Beispiel. Das wurde korrigiert und alle Parameter verwenden die Unterstrichnotation: follow_redirects, proxy_host und so weiter. Einige Parameter wurden dabei auch umbenannt, follow_redirects entspricht dem früheren allowRedirects. Positiv ist aber zu vermerken, dass die Dokumentation zu den Konfigurationsparametern äußerst ausführlich geworden ist, und Standardwerte explizit nennt. Wenn das Objekt erfolgreich erzeugt wurde, wird die Abfrage mit send() durchgeführt. Die Methode liefert ein HTTP_Request2_Response-Objekt zurück. Dazu später mehr.

Adapter

Adapterklassen sind ein neues Konzept in HTTP_Request2. Eine Adapterklasse ist dafür zuständig, die eigentliche Abfrage durchzuführen:

  • HTTP_Request2_Adapter_Socket verwendet die PHP-Socket-Funktionen
  • HTTP_Request2_Adapter_Curl verwendet die PHP-Curl-Funktionen
  • HTTP_Request2_Adapter_Mock stellt ein Mock-Objekt für HTTP-Anfragen bereit

Sie können auch eine eigene Adapterklasse erstellen, die Sie von HTTP_Request2_Adapter ableiten müssen. Welche Klasse zum Einsatz kommt, entscheiden Sie mit dem Konfigurationsparameter adapter. Sie können dort den Namen der Klasse übergeben oder – interessant im Rahmen des Dependency-Injection-Patterns – ein bereits initialisiertes Objekt.

Der Mock-Adapter

Skripte und Funktionen, die den Aufruf zur externen Datenquelle erfordern, stellen bei Tests, insbesondere bei Unit Tests immer ein Problem dar. Schließlich soll ein Test den eigenen Code testen, und nicht von der Erreichbarkeit eines fremden Servers abhängen. Deshalb wurde der Mock-Adapter eingeführt. Statt tatsächlich eine HTTP-Anfrage durchzuführen, liefert er ein vordefiniertes Ergebnis. Dazu muss im Vorfeld ein Objekt der Mock-Klasse im Vorfeld mit den zu erwartenden Daten erzeugt werden:

$mock = new HTTP_Request2_Adapter_Mock();
$mock->addResponse(
    "HTTP/1.1 200 OKrn" .
    "Content-Length: 13rn" .
    "Connection: closern" .
    "rn" .
    "Serverantwort");

Dieses Objekt wird bei der Initialisierung der Request2-Klasse übergeben:

$request = new HTTP_Request2(
  'http://example.com/', HTTP_Request2::METHOD_GET,
  array('adapter' => $mock));
$response = $request->send();
echo $response->getBody();

Sie können addResponse() mehrfach mit verschiedenen Antworten aufrufen. Die Antworten werden nacheinander ausgeliefert:

$mock->addResponse($antwortA);
$mock->addResponse($antwortB);
.
$responseA = $request->send(); // liefert antwortA
$responseB = $request->send(); // liefert antwortB
Gekapselte Antwort

Die Behandlung der Antwort hat sich ebenfalls deutlich verändert. Die send()-Methode liefert nun die Antwort der Anfrage in Form des Response-Objekts zurück. Es enthält die Header, den Antwort-HTTP-Status und den Inhalt der Antwort. Des Weiteren gibt getReasonPhrase() die Bedeutung des erhaltenen HTTP-Status als Klartext zurück. Intern dekodiert die Klasse den Inhalt, wenn er komprimiert übertragen wurde.

Seit mehr als drei Jahren implementiert Alexander Merz im Redaktionssystem von Golem.de selbst die kuriosesten Wünsche der Redakteure und baut an der Golem.de-Webseite zur steten Unterhaltung der Leser. Sie erreichen ihn unter alexander.merz[at]gmail.com.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -