Zend_Http_Client-Adapters.xml 19 KB

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