Zend_Http_Client-Adapters.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17023 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.http.client.adapters">
  5. <title>Zend_Http_Client - Verbindungsadapter</title>
  6. <sect2 id="zend.http.client.adapters.overview">
  7. <title>Verbindungsadapter</title>
  8. <para>
  9. Zend_Http_Client basiert auf einem Design mit Verbindungsadaptern. Der
  10. Verbindungsadapter ist das Objekt, welches für die Ausführung der aktuellen Verbindung
  11. zum Server sowie für das Schreiben der Anfragen und Lesen von Antworten verantwortlich
  12. ist. Dieser Verbindungsadapter kann ersetzt werden und man kann den Standard
  13. Verbindungsadapter durch seinen eigenen Adapter erweitern, um ihn mit dem selben
  14. Interface auf seine eigenen Bedürfnisse anzupassen, ohne dass man die gesamte HTTP
  15. Client Klasse erweitern oder ersetzen muss.
  16. </para>
  17. <para>
  18. Derzeit stellt die Zend_Http_Client Klasse vier eingebaute Verbindungsadapter bereit:
  19. <itemizedlist>
  20. <listitem>
  21. <para>
  22. <classname>Zend_Http_Client_Adapter_Socket</classname> (Standard)
  23. </para>
  24. </listitem>
  25. <listitem>
  26. <para>
  27. <classname>Zend_Http_Client_Adapter_Proxy</classname>
  28. </para>
  29. </listitem>
  30. <listitem>
  31. <para>
  32. <classname>Zend_Http_Client_Adapter_Curl</classname>
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. <classname>Zend_Http_Client_Adapter_Test</classname>
  38. </para>
  39. </listitem>
  40. </itemizedlist>
  41. </para>
  42. <para>
  43. Der Verbindungsadapter für das Zend_Http_Client Objekt wird durch Verwendung der
  44. 'adapter' Konfigurationsoption gesetzt. Beim Instanzieren des Client Objektes kann man
  45. die 'adapter' Konfigurationsoption setzen mit einem String, der den Adapternamen (z.B.
  46. 'Zend_Http_Client_Adapter_Socket') enthält, oder mit eine Variable, die ein
  47. Adapterobjekt (z.B. <code>new Zend_Http_Client_Adapter_Test</code>) enthält. Man kann
  48. den Adapter auch danach setzen, indem man die
  49. <classname>Zend_Http_Client->setConfig()</classname> Methode verwendet.
  50. </para>
  51. </sect2>
  52. <sect2 id="zend.http.client.adapters.socket">
  53. <title>Der Socket Adapter</title>
  54. <para>
  55. Der Standard-Adapter von Zend_Http_Client ist der Zend_Http_Client_Adapter_Socket.
  56. Dieser wird benutzt, wenn kein anderer angegeben wird. Der Socket Adapter benutzt die
  57. native PHP Funktion fsockopen(), um die Verbindung aufzubauen, dafür werden keine
  58. besonderen PHP-Extensions oder Einstellungen benötigt.
  59. </para>
  60. <para>
  61. Der Socket Adapter erlaubt verschiedene zusätzliche Konfigurations Optionen die gesetzt
  62. werden können durch Verwendung von <classname>Zend_Http_Client->setConfig()</classname>
  63. oder deren Übergabe an den Konstruktor des Clients.
  64. <table id="zend.http.client.adapter.socket.configuration.table">
  65. <title>Zend_Http_Client_Adapter_Socket Konfigurations Parameter</title>
  66. <tgroup cols="4">
  67. <thead>
  68. <row>
  69. <entry>Parameter</entry>
  70. <entry>Beschreibung</entry>
  71. <entry>Erwarteter Typ</entry>
  72. <entry>Standardwert</entry>
  73. </row>
  74. </thead>
  75. <tbody>
  76. <row>
  77. <entry>persistent</entry>
  78. <entry>
  79. Ob eine persistente TCP Verbindung verwendet werden soll oder nicht
  80. </entry>
  81. <entry>boolean</entry>
  82. <entry>false</entry>
  83. </row>
  84. <row>
  85. <entry>ssltransport</entry>
  86. <entry>SSL Transport Layer (eg. 'sslv2', 'tls')</entry>
  87. <entry>string</entry>
  88. <entry>ssl</entry>
  89. </row>
  90. <row>
  91. <entry>sslcert</entry>
  92. <entry>Pfad zu einem PEM verschlüsselten SSL Zertifikat</entry>
  93. <entry>string</entry>
  94. <entry>null</entry>
  95. </row>
  96. <row>
  97. <entry>sslpassphrase</entry>
  98. <entry>Die PassPhrase für die SSL zertifizierte Datei</entry>
  99. <entry>string</entry>
  100. <entry>null</entry>
  101. </row>
  102. </tbody>
  103. </tgroup>
  104. </table>
  105. <note>
  106. <title>Persistente TCP Verbindungen</title>
  107. <para>
  108. Die Verwendung persistenter TCP Verbindungen kann HTTP Anfragen potentiell
  109. schneller machen - aber in den meisten Fällen, wird es nur einen kleinen
  110. positiven Effekt haben und könnte den HTTP Server überladen zu dem man sich
  111. verbindet.
  112. </para>
  113. <para>
  114. Es wird empfohlen persistente TCP Verbindungen nur dann zu verwenden wenn man
  115. sich zu dem gleichen Server sehr oft verbindet, und man sicher ist das der
  116. Server eine große Anzahl an gleichzeitigen Verbindungen behandeln kann. In jedem
  117. Fall wird empfohlen das der Effekt von persistenten Verbindungen auf beiden, der
  118. Geschwindigkeit des Clients und dem Serverload gemessen wird bevor diese Option
  119. verwendet wird.
  120. </para>
  121. <para>
  122. Zusätzlich, wenn persistente Verbindungen verwendet werden, sollte man
  123. Keep-Alive HTTP Anfragen aktivieren wie in <xref
  124. linkend="zend.http.client.configuration" /> beschrieben - andernfalls werden
  125. persistente Verbindungen nur wenig oder gar keinen Effekt haben.
  126. </para>
  127. </note>
  128. <note>
  129. <title>HTTPS SSL Stream Parameter</title>
  130. <para>
  131. <code>ssltransport, sslcert</code> und <code>sslpassphrase</code> sind nur
  132. relevant wenn HTTPS für die Verbindung verwendet wird.
  133. </para>
  134. <para>
  135. Wärend die Standard SSL Einstellungen für die meisten Anwendungen funktionieren,
  136. kann es notwendig sein diese zu Ändern wenn der Server zu dem man sich verbindet
  137. ein spezielles Client Setup benötigt. Wenn dem so ist, sollte man das Kapitel
  138. über SSL Transport Layer und Optionen lesen das <ulink
  139. url="http://www.php.net/manual/en/transports.php#transports.inet">hier</ulink>
  140. zu finden ist.
  141. </para>
  142. </note>
  143. </para>
  144. <example id="zend.http.client.adapters.socket.example-1">
  145. <title>Den Stream-Typen für eine HTTPS Verbindung einstellen</title>
  146. <programlisting language="php"><![CDATA[
  147. // Konfigurationsparameter setzen
  148. $config = array(
  149. 'adapter' => 'Zend_Http_Client_Adapter_Socket',
  150. 'ssltransport' => 'tls'
  151. );
  152. // Client-Instanz erzeugen
  153. $client = new Zend_Http_Client('https://www.example.com', $config);
  154. // Jetzt wird der Request über eine verschlüsselte Verbindung verschickt
  155. $response = $client->request();
  156. ]]></programlisting>
  157. </example>
  158. <para>
  159. Ein ähnliches Ergebnis erzielt man mit folgendem Code:
  160. </para>
  161. <para>
  162. <code>fsockopen('tls://www.example.com', 443)</code>
  163. </para>
  164. <sect3 id="zend.http.client.adapters.socket.streamcontext">
  165. <title>Anpassen und Zugreifen auf den Socket Adapter Stream Kontext</title>
  166. <para>
  167. Beginnend mit Zend Framework 1.9 bietet
  168. <classname>Zend_Http_Client_Adapter_Socket</classname> direkten Zugriff auf den
  169. darunterliegenden <ulink
  170. url="http://php.net/manual/de/stream.contexts.php">Stream Kontext</ulink> der
  171. für die Verbindung zum entfernten Server verwendet wird. Das erlaubt es
  172. Benutzern spezielle Optionen und Parameter an den TCP Stream zu übergeben und
  173. an den SSL Wrapper im Falle einer HTTPS Verbindung.
  174. </para>
  175. <para>
  176. Man kann auf den Stream Kontext zugreifen indem die folgenden Methoden von
  177. <classname>Zend_Http_Client_Adapter_Socket</classname> verwendet werden:
  178. <itemizedlist>
  179. <listitem>
  180. <para>
  181. <firstterm><classname>setStreamContext($context)</classname></firstterm>
  182. Setzt den Stream Kontext der vom Adapter verwendet werden soll.
  183. Akzeptiert entweder eine Stream Kontext Ressource von durch die
  184. Verwendung der PHP Funktion <ulink
  185. url="http://php.net/manual/de/function.stream-context-create.php"><classname>stream_context_create()</classname></ulink>
  186. erstellt wurde, oder ein Array von Stream Kontext Optionen im
  187. gleichen Format wie es an diese Funktion übergeben wird. Wenn ein
  188. Array übergeben wird, dann wird ein neuer Stream Kontext mit Hilfe
  189. dieser Optionen erstellt, und gesetzt.
  190. </para>
  191. </listitem>
  192. <listitem>
  193. <para>
  194. <firstterm><classname>getStreamContext()</classname></firstterm>
  195. Empfängt den Stream Kontext des Adapters. Wenn kein Stream Kontext
  196. gesetzt ist, wird ein standardmäßiger Stream Kontext erstellt und
  197. zurückgegeben. Man kann anschließend den Wert verschiedener Kontext
  198. Optionen setzen oder empfangen indem die regulären PHP Stream
  199. Kontext Funktionen verwendet werden.
  200. </para>
  201. </listitem>
  202. </itemizedlist>
  203. </para>
  204. <example id="zend.http.client.adapters.socket.streamcontext.example-1">
  205. <title>Setzen von Stream Kontext Optionen für den Socket Adapter</title>
  206. <programlisting language="php"><![CDATA[
  207. // Array von Optionen
  208. $options = array(
  209. 'socket' => array(
  210. // Bindet die lokale Socket Seite an ein spezifisches Interface
  211. 'bindto' => '10.1.2.3:50505'
  212. ),
  213. 'ssl' => array(
  214. // Prüft das Server Side Zertifikat, akzeptiert keine
  215. // ungültigen oder selbst-signierten SSL Zertifikate
  216. 'verify_peer' => true,
  217. 'allow_self_signed' => false,
  218. // Holt das Peer Zertifikat
  219. 'capture_peer_cert' => true
  220. )
  221. );
  222. // Erstellt ein Adapter Objekt und hängt es an den HTTP Client
  223. $adapter = new Zend_Http_Client_Adapter_Socket();
  224. $client = new Zend_Http_Client();
  225. $client->setAdapter($adapter);
  226. // Methode 1: Ein Options Array an setStreamContext() übergeben
  227. $adapter->setStreamContext($options);
  228. // Methode 2: Einen Stream Kontext erstellen und an setStreamContext() übergeben
  229. $context = stream_context_create($options);
  230. $adapter->setStreamContext($context);
  231. // Methode 3: Den Standardmäßigen Stream Kontext holen und Optionen auf Ihm setzen
  232. $context = $adapter->getStreamContext();
  233. stream_context_set_option($context, $options);
  234. // Jetzt die Anfrage durchführen
  235. $response = $client->request();
  236. // Wenn alles gut ging, kann auf den Kontext jetzt zugegriffen werden
  237. $opts = stream_context_get_options($adapter->getStreamContext());
  238. echo $opts['ssl']['peer_certificate'];
  239. ]]></programlisting>
  240. </example>
  241. <note>
  242. <para>
  243. Es ist zu beachten das alle Stream Kontext Optionen gesetzt sein müssen bevor
  244. der Adapter Anfragen durchführt. Wenn kein Kontext gesetzt ist bevor HTTP
  245. Anfragen mit dem Socket Adapter durchgeführt werden, wird ein standardmäßiger
  246. Stream Kontext erstellt. Auf diese Kontext Ressource kann zugegriffen werden
  247. nachdem Anfragen durchgeführt werden indem die
  248. <classname>getStreamContext()</classname> Methode verwendet wird.
  249. </para>
  250. </note>
  251. </sect3>
  252. </sect2>
  253. <sect2 id="zend.http.client.adapters.proxy">
  254. <title>Der Proxy Adapter</title>
  255. <para>
  256. Der Proxy Adapter Zend_Http_Client_Adapter_Proxy verhält sich wie der
  257. standard Zend_Http_Client_Adapter_Socket, mit dem Unterschied, dass
  258. die Verbindung über einen Proxy-Server aufgebaut wird.
  259. </para>
  260. <para>
  261. Der Proxy Adapter benötigt zusätzliche Konfigurationsvariablen, die
  262. nachfolgend gelistet sind.
  263. <table id="zend.http.client.adapters.proxy.table">
  264. <title>Zend_Http_Client Konfigurationsparameter</title>
  265. <tgroup cols="4">
  266. <thead>
  267. <row>
  268. <entry>Parameter</entry>
  269. <entry>Beschreibung</entry>
  270. <entry>Datentyp</entry>
  271. <entry>Beispielwert</entry>
  272. </row>
  273. </thead>
  274. <tbody>
  275. <row>
  276. <entry>proxy_host</entry>
  277. <entry>Proxy-Server-Adresse</entry>
  278. <entry>string</entry>
  279. <entry>'proxy.myhost.com' oder '10.1.2.3'</entry>
  280. </row>
  281. <row>
  282. <entry>proxy_port</entry>
  283. <entry>TCP Port des Proxy-Servers</entry>
  284. <entry>integer</entry>
  285. <entry>8080 (Standardwert) oder 81</entry>
  286. </row>
  287. <row>
  288. <entry>proxy_user</entry>
  289. <entry>Benutzername für die Proxynutzung, falls nötig</entry>
  290. <entry>string</entry>
  291. <entry>'wulli' oder '' für keinen Namen (Standardwert)</entry>
  292. </row>
  293. <row>
  294. <entry>proxy_pass</entry>
  295. <entry>Passwort für die Proxynutzung, falls nötig</entry>
  296. <entry>string</entry>
  297. <entry>'geheim' oder '' für kein Passwort (Standardwert)</entry>
  298. </row>
  299. <row>
  300. <entry>proxy_auth</entry>
  301. <entry>Proxy HTTP Authentifizierungs-Typ</entry>
  302. <entry>string</entry>
  303. <entry>Zend_Http_Client::AUTH_BASIC (Standardwert)</entry>
  304. </row>
  305. </tbody>
  306. </tgroup>
  307. </table>
  308. </para>
  309. <para>
  310. proxy_host muss immer gesetzt werden, ansonsten wird der Proxy-Adapter
  311. auf Zend_Http_Client_Adapter_Socket zurückgreifen und keinen Proxy Server
  312. benutzen.
  313. Wird kein Prot mit übergeben, so versucht der Proxy-Adapter sich auf den
  314. Standardport '8080' zu verbinden.
  315. </para>
  316. <para>
  317. proxy_user und proxy_pass werden nur dann benötigt, wenn der Proxy-Server
  318. tatsächlich eine Authentifizierung erwartet. Werden diese Parameter mit
  319. übergeben, setzt der Proxy-Adapter zusätzlich den 'Proxy-Authentication'
  320. Header bei Anfragen. Wird keine Authentifizierung benötigt, sollten die
  321. beiden Parameter weggelassen werden.
  322. </para>
  323. <para>
  324. proxy_auth setzt den Authentifizierungs-Typ. Dies ist nur nötig, wenn der
  325. Proxy-Server eine Authentifizierung erwartet.
  326. Mögliche Werte entsprechen denen der Zend_Http_Client::setAuth() Methode.
  327. Zur Zeit wird nur die BASIC-Authentifizierung
  328. ((Zend_Http_Client::AUTH_BASIC) unterstützt.
  329. </para>
  330. <example id="zend.http.client.adapters.proxy.example-1">
  331. <title>Zend_Http_Client hinter einem Proxy-Server nutzen</title>
  332. <programlisting language="php"><![CDATA[
  333. // Konfigurationsparameter setzen
  334. $config = array(
  335. 'adapter' => 'Zend_Http_Client_Adapter_Proxy',
  336. 'proxy_host' => 'proxy.int.zend.com',
  337. 'proxy_port' => 8000,
  338. 'proxy_user' => 'shahar.e',
  339. 'proxy_pass' => 'bananashaped'
  340. );
  341. // Client-Objekt instanziieren
  342. $client = new Zend_Http_Client('http://www.example.com', $config);
  343. // $client kann jetzt wie gewohnt benutzt werden
  344. ]]></programlisting>
  345. </example>
  346. <para>
  347. Wie vorher erwähnt, nutzt der Proxy-Adapter eine einfache Socket-Verbindung,
  348. wenn proxy_host nicht gesetzt oder leer gelassen wurde. Dies ermöglicht
  349. die optionale Nutzung eines Proxy-Servers, abhängig von dem proxy_host
  350. Parameter.
  351. </para>
  352. <note>
  353. <para>
  354. Da der Proxy Adapter von <classname>Zend_Http_Client_Adapter_Socket</classname>
  355. abgeleitet ist, kann die Stream Kontext Zugriffsmethode verwendet werden
  356. (siehe <xref linkend="zend.http.client.adapters.socket.streamcontext" />) um
  357. Stream Kontext Optionen auf Proxy Verbindungen zu setzen wie es oben demonstriert
  358. wurde.
  359. </para>
  360. </note>
  361. </sect2>
  362. <sect2 id="zend.http.client.adapters.curl">
  363. <title>Der cURL Adapter</title>
  364. <para>
  365. cURL ist eine Standard HTTP Client Bibliothek die mit vielen Betriebssystemen
  366. ausgeliefert wird, und kann in PHP über die cURL Erweiterung verwendet werden.
  367. Sie bietet Funktionalitäten für viele spezielle Fälle die für einen HTTP Client
  368. auftreten können und machen sie zu einer perfekten Wahl für einen HTTP Adapter.
  369. Sie unterstützt sichere Verbindungen, Proxies, alle Arten von Authentifizierungs-
  370. mechanismen und glänzt in Anwendungen die große Dateien zwischen Servern bewegen
  371. müssen.
  372. </para>
  373. <example id="zend.http.client.adapters.curl.example-1">
  374. <title>Setzen von cURL Optionen</title>
  375. <programlisting language="php"><![CDATA[
  376. $config = array(
  377. 'adapter' => 'Zend_Http_Client_Adapter_Curl',
  378. 'curloptions' => array(CURLOPT_FOLLOWLOCATION => true),
  379. );
  380. $client = new Zend_Http_Client($uri, $config);
  381. ]]></programlisting>
  382. </example>
  383. <para>
  384. Standardmäßig ist der cURL Adapter so konfiguriert das er sich genauso wie der
  385. Socket Adapter verhält und er akzeptiert auch die gleichen Konfigurationsparameter wie
  386. die Socket und Proxy Adapter. Man kann die cURL Optionen entweder durch den
  387. 'curloptions' Schlüssel im Konstruktor des Adapters, oder durch den Aufruf von
  388. <code>setCurlOption($name, $value)</code>, verändern. Der <code>$name</code>
  389. Schlüssel entspricht den CURL_* Konstanten der cURL Erweiterung. Man kann auf den
  390. CURL Handler durch den Aufruf von <code>$adapter->getHandle();</code> Zugriff erhalten.
  391. </para>
  392. <example id="zend.http.client.adapters.curl.example-2">
  393. <title>Dateien von Hand übertragen</title>
  394. <para>
  395. Man kan cURL verwenden um große Dateien über HTTP durch einen Dateihandle zu
  396. übertragen.
  397. </para>
  398. <programlisting language="php"><![CDATA[
  399. $putFileSize = filesize("filepath");
  400. $putFileHandle = fopen("filepath", "r");
  401. $adapter = new Zend_Http_Client_Adapter_Curl();
  402. $client = new Zend_Http_Client();
  403. $client->setAdapter($adapter);
  404. $adapter->setConfig(array(
  405. 'curloptions' => array(
  406. CURLOPT_INFILE => $putFileHandle,
  407. CURLOPT_INFILESIZE => $putFileSize
  408. )
  409. ));
  410. $client->request("PUT");
  411. ]]></programlisting>
  412. </example>
  413. </sect2>
  414. <sect2 id="zend.http.client.adapters.test">
  415. <title>Der Test Adapter</title>
  416. <para>
  417. Manchmal ist es sehr schwer Code tu testen, der von HTTP Verbindungen abhängig ist.
  418. Zum Beispiel verlangt das Testen einer Applikation, die einen RSS Feed von einem fremden
  419. Server anfordert, eine Netzwerkverbindung, die nicht immer verfügbar ist.
  420. </para>
  421. <para>
  422. Aus diesem Grund wird der Zend_Http_Client_Adapter_Test Adapter bereit gestellt. Man
  423. kann seine eigenen Applikationen schreiben, um Zend_Http_Client zu verwenden, und nur
  424. zu Testzwecken, z.B. in der Unit Test Suite, den Standardadapter durch den Testadapter
  425. (ein Mock Objekt) austauschen, um Tests ohne direkte Serverbindungen auszuführen.
  426. </para>
  427. <para>
  428. Der Zend_Http_Client_Adapter_Test Adapter stellt die zusätzliche Methode setResponse()
  429. bereit. Diese Methode nimmt einen Parameter entgegen, der eine HTTP Antwort entweder als
  430. Text oder als Zend_Http_Response Objekt repräsentiert. Einmal eingerichtet, wird der
  431. Testadapter immer diese Antwort zurückgeben, ohne tatsächlich eine HTTP Anfrage
  432. auszuführen.
  433. </para>
  434. <example id="zend.http.client.adapters.test.example-1">
  435. <title>Testen gegen einen einfachen HTTP Response Stumpf</title>
  436. <programlisting language="php"><![CDATA[
  437. // Instanziere einen neuen Adapter und Client
  438. $adapter = new Zend_Http_Client_Adapter_Test();
  439. $client = new Zend_Http_Client('http://www.example.com', array(
  440. 'adapter' => $adapter
  441. ));
  442. // Setze die erwartete Antwort
  443. $adapter->setResponse(
  444. "HTTP/1.1 200 OK" . "\r\n" .
  445. "Content-type: text/xml" . "\r\n" .
  446. "\r\n" .
  447. '<?xml version="1.0" encoding="UTF-8"?>' .
  448. '<rss version="2.0" ' .
  449. ' xmlns:content="http://purl.org/rss/1.0/modules/content/"' .
  450. ' xmlns:wfw="http://wellformedweb.org/CommentAPI/"' .
  451. ' xmlns:dc="http://purl.org/dc/elements/1.1/">' .
  452. ' <channel>' .
  453. ' <title>Premature Optimization</title>' .
  454. // und so weiter...
  455. '</rss>');
  456. $response = $client->request('GET');
  457. // .. setze die Verarbeitung von $response fort...
  458. ]]></programlisting>
  459. </example>
  460. <para>
  461. Das obere Beispiel zeigt, wie man einen HTTP Client voreinstellen kann, damit er die
  462. benötigte Antwort zurückgibt. Danach kann man mit den Testen des eigenen Codes weiter
  463. machen, ohne von einer Netzwerkverbindung, der Serverantwort, etc. abhängig zu sein. In
  464. diesem Fall würde der Test mit der Prüfung fortfahren, wie die Applikation das XML aus
  465. der Antwort verarbeitet..
  466. </para>
  467. <para>
  468. Manchmal erfordert ein einziger Methoden-Aufruf mehrere HTTP-Übertragungen.
  469. Um mehrere HTTP-Antworten zu erstellen, müssen mit setResponse() die erste
  470. und mit addResponse() die nachfolgenden Antworten gesetzt werden.
  471. </para>
  472. <example id="zend.http.client.adapters.test.example-2">
  473. <title>Test mit mehreren HTTP-Antworten</title>
  474. <programlisting language="php"><![CDATA[
  475. // Instanzen vom Adapter und Client erzeugen
  476. $adapter = new Zend_Http_Client_Adapter_Test();
  477. $client = new Zend_Http_Client('http://www.example.com', array(
  478. 'adapter' => $adapter
  479. ));
  480. // mit setResponse() die erste Antwort setzen
  481. $adapter->setResponse(
  482. "HTTP/1.1 302 Found" . "\r\n" .
  483. "Location: /" . "\r\n" .
  484. "Content-Type: text/html" . "\r\n" .
  485. "\r\n" .
  486. '<html>' .
  487. ' <head><title>Moved</title></head>' .
  488. ' <body><p>This page has moved.</p></body>' .
  489. '</html>');
  490. // mit addResponse() nachfolgende Antworten setzen
  491. $adapter->addResponse(
  492. "HTTP/1.1 200 OK" . "\r\n" .
  493. "Content-Type: text/html" . "\r\n" .
  494. "\r\n" .
  495. '<html>' .
  496. ' <head><title>Meine Haustierseite</title></head>' .
  497. ' <body><p>...</p></body>' .
  498. '</html>');
  499. // Das $client Objekt kann jetzt zu testzwecken herangezogen werden,
  500. // indem es wie ein normales Client-Objekt benutzt wird.
  501. ]]></programlisting>
  502. </example>
  503. <para>
  504. Die HTTP-Antworten werden in der Reihenfolge zurückgegeben,
  505. in der sie angelegt worden sind. Gibt es mehr Anfragen als
  506. Antworten, so wird wieder bei der ersten Antwort angefangen.
  507. </para>
  508. <para>
  509. Das oben angeführte Beispiel kann dazu benutzt werden, um die Reaktion
  510. der eigenen Anwendung auf einen 302 Redirect (Weiterleitung) zu testen.
  511. Abhängig von Ihrer Anwendung, kann es gewollt oder nicht gewollt sein,
  512. dass dem Redirect gefolgt wird.
  513. </para>
  514. </sect2>
  515. <sect2 id="zend.http.client.adapters.extending">
  516. <title>Einen eigenen Adapter erstellen</title>
  517. <para>
  518. Es ist möglich eigene Verbindungs-Adapter zu schreiben, die spezielle
  519. Bedürfnisse, wie persistente Sockets oder gecachte Verbindungen, abdecken.
  520. Diese können dann, wie gewohnt mit dem Zend_Http_Client benutzt werden.
  521. </para>
  522. <para>
  523. Um einen neuen Adapter zu erstellen, muss eine neue Klasse angelegt werden,
  524. die das Zend_Http_Client_Adapter_Interface implementiert. Nachfolgend
  525. finden Sie ein Gerüst für einen neuen Adapter. Die public-Methoden müssen
  526. unbedingt implementiert werden.
  527. </para>
  528. <example id="zend.http.client.adapters.extending.example-1">
  529. <title>Gerüst für einen eigenen Verbindungs-Adapter</title>
  530. <programlisting language="php"><![CDATA[
  531. class MyApp_Http_Client_Adapter_BananaProtocol
  532. implements Zend_Http_Client_Adapter_Interface
  533. {
  534. /**
  535. * Konfigurationsarray für den Adapter
  536. *
  537. * @param array $config
  538. */
  539. public function setConfig($config = array())
  540. {
  541. // in den meisten Fällen kann die Implementierung von
  542. // Zend_Http_Client_Adapter_Socket eins zu eins übernommen werden
  543. }
  544. /**
  545. * Zum Server verbinden
  546. *
  547. * @param string $host
  548. * @param int $port
  549. * @param boolean $secure
  550. */
  551. public function connect($host, $port = 80, $secure = false)
  552. {
  553. // Verbindung zum Server herstellen
  554. }
  555. /**
  556. * Anfrage / Request an den Server stellen
  557. *
  558. * @param string $method
  559. * @param Zend_Uri_Http $url
  560. * @param string $http_ver
  561. * @param array $headers
  562. * @param string $body
  563. * @return string Request as text
  564. */
  565. public function write($method,
  566. $url,
  567. $http_ver = '1.1',
  568. $headers = array(),
  569. $body = '')
  570. {
  571. // Anfrage stellen
  572. // Diese Methode muss die komplette Antwort zurückliefern,
  573. // inklusive aller Header
  574. }
  575. /**
  576. * Antwort des Servers auslesen
  577. *
  578. * @return string
  579. */
  580. public function read()
  581. {
  582. // Antwort des Servers lesen und als String zurückgeben
  583. }
  584. /**
  585. * Verbindung zum Server beenden
  586. *
  587. */
  588. public function close()
  589. {
  590. // Verbindung beenden - wird zum Schluss aufgerufen
  591. }
  592. }
  593. // Jetzt kann der Adapter benutzt werden:
  594. $client = new Zend_Http_Client(array(
  595. 'adapter' => 'MyApp_Http_Client_Adapter_BananaProtocol'
  596. ));
  597. ]]></programlisting>
  598. </example>
  599. </sect2>
  600. </sect1>