Zend_Http_Client-Adapters.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <!-- EN-Revision: 12739 -->
  2. <sect1 id="zend.http.client.adapters">
  3. <title>Zend_Http_Client - Adaptateurs de connexion</title>
  4. <sect2 id="zend.http.client.adapters.overview">
  5. <title>Présentation globale</title>
  6. <para><classname>Zend_Http_Client</classname> accepte des objets adaptateurs. Ces objets ont la responsabilité de soutenir
  7. la connexion vers un serveur, à savoir écrire des requêtes et lire des réponses L'adaptateur peut donc être
  8. changé, et même écrit ou réécrit pour correspondre à vos besoins, sans avoir l'obligation de toucher à toute la
  9. classe dite "client". Vous vous connectez et manipulez votre connexion toujours de la même manière quelque soit
  10. l'adaptateur situé dessous.</para>
  11. <para>Actuellement, la classe cliente <classname>Zend_Http_Client</classname> est fournie avec trois adaptateurs :
  12. <itemizedlist>
  13. <listitem>
  14. <para><classname>Zend_Http_Client_Adapter_Socket</classname> (défaut)</para>
  15. </listitem>
  16. <listitem>
  17. <para><classname>Zend_Http_Client_Adapter_Proxy</classname></para>
  18. </listitem>
  19. <listitem>
  20. <para><classname>Zend_Http_Client_Adapter_Test</classname></para>
  21. </listitem>
  22. </itemizedlist></para>
  23. <para>L'objet Zend_Http_Client se voit spécifié un adaptateur via son constructeur avec le tableau d'options, à
  24. l'index 'adapter'. Fournissez alors une chaîne représentant la classe d'adaptateur à utiliser (par exemple
  25. 'Zend_Http_Client_Adapter_Socket'), ou un objet directement (par exemple <code> new
  26. Zend_Http_Client_Adapter_Test</code>). Vous pouvez de même passer un adaptateur plus tard, avec la méthode
  27. <classname>Zend_Http_Client-&gt;setConfig()</classname>.</para>
  28. </sect2>
  29. <sect2 id="zend.http.client.adapters.socket">
  30. <title>Adaptateur Socket</title>
  31. <para>L'adaptateur par défaut est Zend_Http_Client_Adapter_Socket. Il est basé sur les fonctions PHP
  32. <code>fsockopen()</code> et soeurs. Il ne nécessite donc aucune extension particulière ni option de compilation
  33. de PHP.</para>
  34. <para>L'adaptateur Socket peut être configuré avec des options, passées par
  35. <classname>Zend_Http_Client-&gt;setConfig()</classname> ou au constructeur du client. <table
  36. id="zend.http.client.adapter.socket.configuration.table">
  37. <title>Zend_Http_Client_Adapter_Socket configuration</title>
  38. <tgroup cols="4">
  39. <thead>
  40. <row>
  41. <entry>Paramètre</entry>
  42. <entry>Description</entry>
  43. <entry>Types attendus</entry>
  44. <entry>Valeur par défaut</entry>
  45. </row>
  46. </thead>
  47. <tbody>
  48. <row>
  49. <entry>persistent</entry>
  50. <entry>Utilise ou non les connexions TCP persistantes</entry>
  51. <entry>booléen</entry>
  52. <entry>false</entry>
  53. </row>
  54. <row>
  55. <entry>ssltransport</entry>
  56. <entry>Couche de transport SSL ('sslv2', 'tls')</entry>
  57. <entry>chaîne</entry>
  58. <entry>ssl</entry>
  59. </row>
  60. <row>
  61. <entry>sslcert</entry>
  62. <entry>Chemin vers le certificat SSL encodé PEM</entry>
  63. <entry>chaîne</entry>
  64. <entry>null</entry>
  65. </row>
  66. <row>
  67. <entry>sslpassphrase</entry>
  68. <entry>Phrase de passe pour le fichier de certificat SSL</entry>
  69. <entry>chaîne</entry>
  70. <entry>null</entry>
  71. </row>
  72. </tbody>
  73. </tgroup>
  74. </table> <note>
  75. <title>Connexions TCP persistantes</title>
  76. <para>L'utilisation de connexions TCP persistantes peut potentiellement accélérer vos requêtes HTTP mais
  77. n'a, dans la plupart des cas, qu'un petit effet positif et peut surcharger le serveur HTTP auquel vous
  78. êtes connecté.</para>
  79. <para>Il est recommandé d'utiliser les connexions TCP persistantes seulement si vous vous connectez au
  80. même serveur très fréquemment, et que vous êtes sûr que le serveur est capable de gérer un nombre élevé
  81. de connections concurrentes. Dans tous les cas vous êtes encouragés à tester l'effet des connections
  82. persistantes à la fois sur l'accélération du client et sur la charge du serveur avant d'activer cette
  83. option.</para>
  84. <para>De plus, quand vous utilisez des connexions persistantes, il est recommandé d'activer l'option
  85. "Keep-Alive" décrite dans <xref linkend="zend.http.client.configuration" />, sinon les connexions
  86. persistantes n'auront que peu ou pas d'effet.</para>
  87. </note> <note>
  88. <title>HTTPS SSL Paramètres de flux</title>
  89. <para><code>ssltransport, sslcert</code> and <code>sslpassphrase</code> sont seulement appropriées lors
  90. de l'utilisation d'HTTPS.</para>
  91. <para>Bien que les réglages par défaut du mode SSL fonctionneront pour la plupart des applications, vous
  92. pourrez avoir besoin de les changer si le serveur, auquel vous vous connectez, requière un paramétrage
  93. particulier du client. Dans ce cas, vous devriez lire les sections sur la couche de transport SSL et ses
  94. options à cette <ulink
  95. url="http://www.php.net/manual/en/transports.php#transports.inet">adresse</ulink>.</para>
  96. </note></para>
  97. <example id="zend.http.client.adapters.socket.example-1">
  98. <title>Changer la couche de transport HTTPS</title>
  99. <programlisting role="php"><![CDATA[
  100. // Définit des paramètres de configuration
  101. $config = array(
  102. 'adapter' => 'Zend_Http_Client_Adapter_Socket',
  103. 'ssltransport' => 'tls'
  104. );
  105. // Instantie un objet client
  106. $client = new Zend_Http_Client('https://www.example.com', $config);
  107. // Cette requête sera envoyée vers une connexion sécurisée TLS
  108. $response = $client->request();
  109. ]]></programlisting>
  110. </example>
  111. <para>Le résultat ci-dessus sera similaire à l'ouverture d'une connexion TCP avec la commande PHP suivante
  112. :</para>
  113. <para><code>fsockopen('tls://www.example.com', 443)</code></para>
  114. </sect2>
  115. <sect2 id="zend.http.client.adapters.proxy">
  116. <title>Adaptateur Proxy</title>
  117. <para>L'adaptateur Zend_Http_Client_Adapter_Proxy est identique à celui par défaut, Socket, sauf que Proxy se
  118. connectera au serveur via un serveur Proxy (mandataire). Cette utilisation peut être rencontrée pour des raisons
  119. de performances ou de sécurité.</para>
  120. <para>En utilisant l'adaptateur Proxy, quelques paramètres de configuration seront nécessaires en plus du
  121. paramètre 'adapter' : <table id="zend.http.client.adapters.proxy.table">
  122. <title>Zend_Http_Client paramètres de configuration</title>
  123. <tgroup cols="4">
  124. <thead>
  125. <row>
  126. <entry>Paramètre</entry>
  127. <entry>Description</entry>
  128. <entry>Valeurs attendues</entry>
  129. <entry>Valeur par défaut</entry>
  130. </row>
  131. </thead>
  132. <tbody>
  133. <row>
  134. <entry>proxy_host</entry>
  135. <entry>Adresse du serveur Proxy</entry>
  136. <entry>chaîne</entry>
  137. <entry>'proxy.myhost.com' ou '10.1.2.3'</entry>
  138. </row>
  139. <row>
  140. <entry>proxy_port</entry>
  141. <entry>Port du serveur Proxy</entry>
  142. <entry>entier</entry>
  143. <entry>8080 (défaut) ou 81</entry>
  144. </row>
  145. <row>
  146. <entry>proxy_user</entry>
  147. <entry>nom d'utilisateur pour le Proxy, si requis</entry>
  148. <entry>chaîne</entry>
  149. <entry>'shahar' ou '' pour aucun (défaut)</entry>
  150. </row>
  151. <row>
  152. <entry>proxy_pass</entry>
  153. <entry>Mot de passe du Proxy, si requis</entry>
  154. <entry>chaîne</entry>
  155. <entry>'secret' ou '' pour aucun (défaut)</entry>
  156. </row>
  157. <row>
  158. <entry>proxy_auth</entry>
  159. <entry>Type d'authentification HTTP du Proxy</entry>
  160. <entry>chaîne</entry>
  161. <entry>Zend_Http_Client::AUTH_BASIC (défaut)</entry>
  162. </row>
  163. </tbody>
  164. </tgroup>
  165. </table></para>
  166. <para><code>proxy_host</code> devrait toujours être fourni. Si ça n'est pas le cas, alors le client retournera
  167. sur une connexion Socket par défaut. <code>proxy_port</code> est par défaut à "8080".</para>
  168. <para><code>proxy_user</code> et <code>proxy_pass</code> ne sont requis que si le serveur Proxy demande une
  169. authentification. Si vous remplissez ces options, alors un champ d'en-tête HTTP "Proxy-Authentication" sera
  170. ajouté à vos requêtes, via votre client.</para>
  171. <para><code>proxy_auth</code> définit le type d'authentification à utiliser, si le serveur Proxy demande une
  172. authentification. Actuellement, seule la méthode "basic" (<classname>Zend_Http_Client::AUTH_BASIC</classname>) est
  173. supportée.</para>
  174. <example id="zend.http.client.adapters.proxy.example-1">
  175. <title>Utiliser Zend_Http_Client derrière un serveur Proxy</title>
  176. <programlisting role="php"><![CDATA[
  177. // Paramètres de configuration
  178. $config = array(
  179. 'adapter' => 'Zend_Http_Client_Adapter_Proxy',
  180. 'proxy_host' => 'proxy.int.zend.com',
  181. 'proxy_port' => 8000,
  182. 'proxy_user' => 'shahar.e',
  183. 'proxy_pass' => 'bananashaped'
  184. );
  185. // Crée l'objet client
  186. $client = new Zend_Http_Client('http://www.example.com', $config);
  187. // utilisez l'objet client ici ...
  188. ]]></programlisting>
  189. </example>
  190. <para>Comme déjà dit, si proxy_host n'est pas rempli ou défini en tant que chaîne vide, alors le client
  191. utilisera l'adaptateur Socket par défaut. Ceci est utile si le proxy est utilisé optionnellement, ou par
  192. intermittence.</para>
  193. </sect2>
  194. <sect2 id="zend.http.client.adapters.test">
  195. <title>Adaptateur Test</title>
  196. <para>Il est quelque fois difficile de tester une application qui a besoin d'une connexion HTTP. Par exemple,
  197. une application qui est en charge de lire un flux RSS aura besoin d'une connexion, qui n'est pas tout le temps
  198. disponible.</para>
  199. <para>C'est pour cette raison que l'adaptateur <classname>Zend_Http_Client_Adapter_Test</classname> est présent. Vous
  200. pouvez de cette manière écrire vos applications, et lors de la phase de tests, passer votre connexion sur
  201. l'adaptateur Test (objet mock).</para>
  202. <para>La classe <classname>Zend_Http_Client_Adapter_Test</classname> possède une méthode supplémentaire,
  203. <code>setResponse()</code>. Elle prend en paramètre un objet <classname>Zend_Http_Response</classname> ou une chaîne. Une
  204. fois cet objet de réponse déterminé, l'adaptateur de Test retournera toujours cette réponse, sans effectuer de
  205. réelle requête HTTP.</para>
  206. <example id="zend.http.client.adapters.test.example-1">
  207. <title>Tester avec un objet de réponse HTTP unique</title>
  208. <programlisting role="php"><![CDATA[
  209. // Création de l'adatateur et de l'objet client :
  210. $adapter = new Zend_Http_Client_Adapter_Test();
  211. $client = new Zend_Http_Client('http://www.example.com', array(
  212. 'adapter' => $adapter
  213. ));
  214. // Passage de l'objet de réponse
  215. $adapter->setResponse(
  216. "HTTP/1.1 200 OK" . "\r\n" .
  217. "Content-type: text/xml" . "\r\n" .
  218. "\r\n" .
  219. '<?xml version="1.0" encoding="UTF-8"?>' .
  220. '<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"' .
  221. ' xmlns:wfw="http://wellformedweb.org/CommentAPI/"' .
  222. ' xmlns:dc="http://purl.org/dc/elements/1.1/">' .
  223. ' <channel>' .
  224. ' <title>Premature Optimization</title>' .
  225. // etc....
  226. '</rss>');
  227. $response = $client->request('GET');
  228. // ... continuez à parser $response...
  229. ]]></programlisting>
  230. </example>
  231. <para>L'exemple ci dessus montre comment préconfigurer la réponse qui sera retournée lors d'une requête de votre
  232. objet client. Ainsi lors des tests, votre application continuera de se comporter normalement, elle aura tout
  233. simplement été trompée (mock). Aucune connexion HTTP n'est dans ce cas là nécessaire.</para>
  234. <para>Quelques fois, plusieurs transactions HTTP peuvent être nécessaires. Une réponse peut demander une
  235. redirection, vers une autre. Dans ce cas, utiliser <code>setResponse()</code> toute seule n'est pas possible car
  236. il ne sera pas possible de spécifier les réponses suivantes, nécessaires alors à l'application.</para>
  237. <example id="zend.http.client.adapters.test.example-2">
  238. <title>Tester avec plusieurs réponses HTTP</title>
  239. <programlisting role="php"><![CDATA[
  240. // Création des objets adaptateur, et client
  241. $adapter = new Zend_Http_Client_Adapter_Test();
  242. $client = new Zend_Http_Client('http://www.example.com', array(
  243. 'adapter' => $adapter
  244. ));
  245. // Configuration de la première réponse attendue
  246. $adapter->setResponse(
  247. "HTTP/1.1 302 Found" . "\r\n" .
  248. "Location: /" . "\r\n" .
  249. "Content-Type: text/html" . "\r\n" .
  250. "\r\n" .
  251. '<html>' .
  252. ' <head><title>Moved</title></head>' .
  253. ' <body><p>This page has moved.</p></body>' .
  254. '</html>');
  255. // Configuration des réponses successives
  256. $adapter->addResponse(
  257. "HTTP/1.1 200 OK" . "\r\n" .
  258. "Content-Type: text/html" . "\r\n" .
  259. "\r\n" .
  260. '<html>' .
  261. ' <head><title>My Pet Store Home Page</title></head>' .
  262. ' <body><p>...</p></body>' .
  263. '</html>');
  264. // l'objet $client est prêt à être testé
  265. // son comportement est déja configuré
  266. ]]></programlisting>
  267. </example>
  268. <para>La méthode <code>setResponse()</code> détruit toutes les réponses dans le buffer de
  269. <classname>Zend_Http_Client_Adapter_Test</classname> et définit la première réponse qui sera retournée. La méthode
  270. <code>addResponse()</code> définit les réponses suivantes.</para>
  271. <para>Les réponses seront rejouées dans leur ordre d'ajout.</para>
  272. <para>Dans l'exemple ci-dessus, l'adaptateur est configuré pour un scénario de test de redirections 302. En
  273. fonction de votre application, le suivi d'une redirection peut être ou non désiré. Dans notre exemple, nous nous
  274. attendons à ce que la redirection soit suivie et nous configurons notre adaptateur de tests pour ceci. La
  275. réponse de redirection originelle (302) est définie avec la méthode <code>setResponse()</code>, quant à la
  276. réponse non redirigeante (200) suivante, elles est définie avec la méthode <code>addResponse()</code>. Lorsque
  277. votre objet client est configuré, vous pouvez l'injecter dans votre application à tester, et voir le résultat et
  278. les comportements.</para>
  279. </sect2>
  280. <sect2 id="zend.http.client.adapters.extending">
  281. <title>Créer vos propres adaptateurs de connexion</title>
  282. <para>Vous pouvez créer vos propres adaptateurs, si vous avez un besoin spécial à utiliser. Par exemple, des
  283. possibilités de cache, ou des sockets persistantes.</para>
  284. <para>Pour ceci, votre classe d'adaptateur doit implémenter l'interface
  285. <classname>Zend_Http_Client_Adapter_Interface</classname>. L'exemple suivant montre un squelette de classe. Toutes les
  286. méthodes publiques, ici, sont indispensables à la classe, elles sont issues de l'interface :</para>
  287. <example id="zend.http.client.adapters.extending.example-1">
  288. <title>Création de votre propre adaptateur de connexion</title>
  289. <programlisting role="php"><![CDATA[
  290. class MyApp_Http_Client_Adapter_BananaProtocol
  291. implements Zend_Http_Client_Adapter_Interface
  292. {
  293. /**
  294. * Définit le tableau de configuration pour cet adaptateur
  295. *
  296. * @param array $config
  297. */
  298. public function setConfig($config = array())
  299. {
  300. // Ceci change rarement, vous devriez copier l'implémentation
  301. // présente dans Zend_Http_Client_Adapter_Socket.
  302. }
  303. /**
  304. * Connecte à une serveur distant
  305. *
  306. * @param string $host
  307. * @param int $port
  308. * @param boolean $secure
  309. */
  310. public function connect($host, $port = 80, $secure = false)
  311. {
  312. // Etablit la connexion au serveur
  313. }
  314. /**
  315. * Envoie une requête au serveur
  316. *
  317. * @param string $method
  318. * @param Zend_Uri_Http $url
  319. * @param string $http_ver
  320. * @param array $headers
  321. * @param string $body
  322. * @return string Request as text
  323. */
  324. public function write($method,
  325. $url,
  326. $http_ver = '1.1',
  327. $headers = array(),
  328. $body = '')
  329. {
  330. // Envoie la requête au serveur distant. Cette fonction devrait
  331. // retourner la requête complète (en-tête et corps) as a string
  332. }
  333. /**
  334. * Lit la réponse du serveur
  335. *
  336. * @return string
  337. */
  338. public function read()
  339. {
  340. // Lit la réponse du serveur distant, et la retourne sous forme
  341. // de chaine de caractères
  342. }
  343. /**
  344. * Ferme la connexion avec le serveur
  345. *
  346. */
  347. public function close()
  348. {
  349. // Ferme la connexion, appelée en dernière.
  350. }
  351. }
  352. // Maintenant, vous pouvez utiliser cet adaptateur :
  353. $client = new Zend_Http_Client(array(
  354. 'adapter' => 'MyApp_Http_Client_Adapter_BananaProtocol'
  355. ));
  356. ]]></programlisting>
  357. </example>
  358. </sect2>
  359. </sect1>