Zend_Http_Client - VerbindungsadapterVerbindungsadapterZend_Http_Client basiert auf einem Design mit Verbindungsadaptern. Der Verbindungsadapter ist das Objekt, welches für die Ausführung der aktuellen Verbindung zum Server sowie für das Schreiben der Anfragen und Lesen von Antworten verantwortlich ist. Dieser Verbindungsadapter kann ersetzt werden und man kann den Standard-Verbindungsadapter durch seinen eigenen Adapter erweitern, um ihn mit demselben Interface auf seine eigenen Bedürfnisse anzupassen, ohne dass man die gesamte HTTP Client-Klasse erweitern oder ersetzen muss. Derzeit stellt die Zend_Http_Client-Klasse vier eingebaute Verbindungsadapter bereit:
Der Verbindungsadapter für das Zend_Http_Client-Objekt wird durch Verwendung der Konfigurationsoption 'adapter' gesetzt. Beim Instanzieren des Client Objektes kann man die Konfigurationsoption 'adapter' mit einem String setzen, der den Adapternamen (z.B. 'Zend_Http_Client_Adapter_Socket') enthält, oder mit einer Variablen, die ein Adapterobjekt (z.B. new Zend_Http_Client_Adapter_Test) enthält. Man kann den Adapter auch danach setzen, indem man die Zend_Http_Client->setConfig() Methode verwendet. Der Socket-AdapterDer Standard-Adapter ist Zend_Http_Client_Adapter_Socket. Dieser wird benutzt, wenn kein anderer angegeben wird. Der Socket-Adapter benutzt die native PHP-Funktion fsockopen(), um die Verbindung aufzubauen, dafür werden keine besonderen Erweiterungen oder Einstellungen benötigt. Der Socket-Adapter erlaubt verschiedene zusätzliche Konfigurationsoptionen, die gesetzt werden können durch Verwendung von Zend_Http_Client->setConfig() oder deren Übergabe an den Konstruktor des Clients.
Example #1 Den Stream-Typen für eine HTTPS-Verbindung einstellen
Ein ähnliches Ergebnis erzielt man mit folgendem Code: fsockopen('tls://www.example.com', 443) Anpassen und Zugreifen auf den Socket Adapter Stream KontextBeginnend mit Zend Framework 1.9 bietet Zend_Http_Client_Adapter_Socket direkten Zugriff auf den darunterliegenden » Stream Kontext der für die Verbindung zum entfernten Server verwendet wird. Das erlaubt es Benutzern spezielle Optionen und Parameter an den TCP-Stream zu übergeben und an den SSL-Wrapper im Falle einer HTTPS-Verbindung. Man kann auf den Stream Kontext zugreifen indem die folgenden Methoden von Zend_Http_Client_Adapter_Socket verwendet werden:
Example #2 Setzen von Stream Kontext Optionen für den Socket Adapter
Der Proxy AdapterDer Proxy Adapter Zend_Http_Client_Adapter_Proxy verhält sich wie der Standard-Zend_Http_Client_Adapter_Socket, mit dem Unterschied, dass die Verbindung über einen HTTP-Proxy-Server aufgebaut wird statt den Server direkt zu kontaktieren. Das erlaubt die Verwendung von Zend_Http_Client hinter Proxy Servern - was manchmal wegen der Sicherheit und Geschwindigkeit notwendig ist. Der Proxy Adapter benötigt zusätzliche Konfigurationsvariablen, die nachfolgend gelistet sind.
proxy_host muss immer gesetzt werden, ansonsten wird der Proxy-Adapter auf Zend_Http_Client_Adapter_Socket zurückgreifen und keinen Proxy Server benutzen. Wird kein Prot mit übergeben, so versucht der Proxy-Adapter sich auf den Standardport '8080' zu verbinden. proxy_user und proxy_pass werden nur dann benötigt, wenn der Proxy-Server tatsächlich eine Authentifizierung erwartet. Werden diese Parameter mit übergeben, setzt der Proxy-Adapter zusätzlich den 'Proxy-Authentication' Header bei Anfragen. Wird keine Authentifizierung benötigt, sollten die beiden Parameter weggelassen werden. proxy_auth setzt den Authentifizierungs-Typ. Dies ist nur nötig, wenn der Proxy-Server eine Authentifizierung erwartet. Mögliche Werte entsprechen denen der Zend_Http_Client::setAuth() Methode. Zur Zeit wird nur die BASIC-Authentifizierung (Zend_Http_Client::AUTH_BASIC) unterstützt. Example #3 Zend_Http_Client hinter einem Proxy-Server nutzen
Wie vorher erwähnt, nutzt der Proxy-Adapter eine einfache Socket-Verbindung, wenn proxy_host nicht gesetzt oder leer gelassen wurde. Dies ermöglicht die optionale Nutzung eines Proxy-Servers, abhängig von dem proxy_host Parameter.
Der cURL AdaptercURL ist eine Standard HTTP Client Bibliothek die mit vielen Betriebssystemen ausgeliefert wird, und kann in PHP über die cURL Erweiterung verwendet werden. Sie bietet Funktionalitäten für viele spezielle Fälle, die für einen HTTP-Client auftreten können und machen sie zu einer perfekten Wahl für einen HTTP-Adapter. Sie unterstützt sichere Verbindungen, Proxies, alle Arten von Authentifizierungsmechanismen und glänzt in Anwendungen, die große Dateien zwischen Servern bewegen müssen. Example #4 Setzen von cURL Optionen
Standardmäßig ist der cURL Adapter so konfiguriert, dass er sich genauso wie der Socket Adapter verhält und er akzeptiert auch die gleichen Konfigurationsparameter wie die Socket und Proxy Adapter. Man kann die cURL Optionen entweder durch den 'curloptions' Schlüssel im Konstruktor des Adapters, oder durch den Aufruf von setCurlOption($name, $value), verändern. Der $name Schlüssel entspricht den CURL_* Konstanten der cURL Erweiterung. Man kann auf den CURL Handler durch den Aufruf von $adapter->getHandle(); Zugriff erhalten. Example #5 Dateien von Hand übertragen Man kan cURL verwenden um große Dateien über HTTP durch einen Dateihandle zu übertragen.
Der Test AdapterManchmal ist es sehr schwer Code zu testen, der von HTTP-Verbindungen abhängig ist. Zum Beispiel verlangt das Testen einer Applikation, die einen RSS-Feed von einem fremden Server anfordert, eine Netzwerkverbindung, die nicht immer verfügbar ist. Aus diesem Grund wird der Zend_Http_Client_Adapter_Test-Adapter bereit gestellt. Man kann seine eigenen Applikationen schreiben, um Zend_Http_Client zu verwenden, und nur zu Testzwecken, z.B. in der UnitTest-Suite, den Standardadapter durch den Testadapter (ein Mock-Objekt) austauschen, um Tests ohne direkte Serverbindungen auszuführen. Der Zend_Http_Client_Adapter_Test-Adapter stellt die zusätzliche Methode setResponse() bereit. Diese Methode nimmt einen Parameter entgegen, der eine HTTP-Antwort entweder als Text oder als Zend_Http_Response-Objekt repräsentiert. Einmal eingerichtet, wird der Testadapter immer diese Antwort zurückgeben, ohne tatsächlich eine HTTP-Anfrage auszuführen. Example #6 Testen gegen einen einfachen HTTP Response Stumpf
Das obige Beispiel zeigt, wie man einen HTTP-Client voreinstellen kann, damit er die benötigte Antwort zurückgibt. Danach kann man mit den Testen des eigenen Codes weiter machen, ohne von einer Netzwerkverbindung, der Serverantwort, etc. abhängig zu sein. In diesem Fall würde der Test mit der Prüfung fortfahren, wie die Applikation das XML aus der Antwort verarbeitet.. Manchmal erfordert ein einziger Methoden-Aufruf mehrere HTTP Übertragungen. In diesem Fall ist es nicht möglich, setResponse() alleine zu verwenden weil es keine Möglichkeit gibt, die nächste Antwort zu setzen, die das Programm benötigt, bevor es zum Aufrufer zurückkommt. Example #7 Test mit mehreren HTTP-Antworten
Die Methode setResponse() löscht alle Antworten im Buffer von Zend_Http_Client_Adapter_Test und setzt die erste Antwort, die zurückgegeben wird. Die Methode addResponse() fügt dann weitere Antworten sukzessiv hinzu. Die HTTP-Antworten werden in der Reihenfolge zurückgegeben, in der sie angelegt worden sind. Gibt es mehr Anfragen als Antworten, so wird wieder bei der ersten Antwort angefangen. Das oben angeführte Beispiel kann dazu benutzt werden, um die Reaktion der eigenen Anwendung auf einen 302 Redirect (Weiterleitung) zu testen. Abhängig von Ihrer Anwendung, kann es gewollt oder nicht gewollt sein, dass dem Redirect gefolgt wird. In unserem Beispiel erwarten wir, dass der Umleitung gefolgt wird und wir konfigurieren den Test-Adapter um uns zu helfen das zu Testen. Die ursprüngliche 302 Antwort wird mit der Methode setResponse() gesetzt und die 200 Antwort, welche als nächstes zurückzugeben ist, wird mit der Methode addResponse() hinzugefügt. Nachdem der Test-Adapter konfiguriert ist, wird der HTTP-Client, der den Adapter enthält unter test in das eigene Objekt injiziert und sein Verhalten getestet. Wenn man will, dass der Adapter auf Wunsch fehlschlägt, kann man setNextRequestWillFail($flag) verwenden. Diese Methode lässt den nächsten Aufruf von connect() eine Zend_Http_Client_Adapter_Exception-Exception werfen. Das kann dann nützlich sein, wenn die eigene Anwendung Inhalte von einer externen Seite cacht (im Falle, dass die Seite ausfällt) und man dieses Feature testen will. Example #8 Erzwingen das der Adapter fehlschlägt
Einen eigenen Adapter erstellenEs ist möglich eigene Verbindungs-Adapter zu schreiben, die spezielle Bedürfnisse, wie persistente Sockets oder gecachte Verbindungen abdecken. Diese können dann wie gewohnt in der eigenen Anwendung benutzt werden. Um einen neuen Adapter zu erstellen, muss eine neue Klasse angelegt werden, die das Zend_Http_Client_Adapter_Interface implementiert. Nachfolgend finden Sie ein Gerüst für einen neuen Adapter. Die public-Methoden müssen unbedingt implementiert werden. Example #9 Gerüst für einen eigenen Verbindungs-Adapter
|
|