Zend_Http_Client-Adapters.xml 19 KB

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