2
0

Zend_XmlRpc_Client.xml 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15746 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.xmlrpc.client">
  5. <title>Zend_XmlRpc_Client</title>
  6. <sect2 id="zend.xmlrpc.client.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Zend Framework bietet Unterstützung, als Client - durch das
  10. <classname>Zend_XmlRpc_Client</classname> Paket - entfernte XML-RPC-Dienste zu nutzen.
  11. Seine wichtigsten Möglichkeiten beinhalten das automatische Umwandeln zwischen PHP und
  12. XML-RPC, ein Server Proxy-Objekt und den Zugriff auf Server-Prüfungsmöglichkeiten.
  13. </para>
  14. </sect2>
  15. <sect2 id="zend.xmlrpc.client.method-calls">
  16. <title>Methodenaufrufe</title>
  17. <para>
  18. Der Konstruktor von <classname>Zend_XmlRpc_Client</classname> erhält den URL
  19. des Endpunktes des entfernten XML-RPC-Server als ersten Parameter.
  20. Die zurückgegebene Instanz kann genutzt werden, um eine beliebige
  21. Anzahl von entfernten Methoden (des Endpunktes) aufzurufen.
  22. </para>
  23. <para>
  24. Um eine entfernte Methode mittels des XML-RPC-Clients aufzurufen,
  25. muss man den Client instanzieren und dessen Methode <code>call()</code>
  26. aufrufen. Das hierunter gegebene Codebeispiel demonstriert den XML-RPC server
  27. der Zend Framework Webseite. Es kann benutzen, um
  28. <classname>Zend_XmlRpc</classname>-Komponenten zu testen oder auszuprobieren.
  29. </para>
  30. <example id="zend.xmlrpc.client.method-calls.example-1">
  31. <title>XML-RPC Methodenaufruf</title>
  32. <programlisting language="php"><![CDATA[
  33. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  34. echo $client->call('test.sayHello');
  35. // hello
  36. ]]></programlisting>
  37. </example>
  38. <para>
  39. Der - durch den Aufruf einer entfernten Methode - zurückgegebene, typenlose
  40. XML-RPC Wert wird automatisch zu dessen nativen PHP-Äquivalent umgeformt.
  41. In obigem Beispiel wird ein <type>String</type> zurückgegeben und ist
  42. sofort benutzbar.
  43. </para>
  44. <para>
  45. Der erste Parameter the Methode <code>call()</code> ist der Name der
  46. aufzurufenden Methode. Wenn die entfernte Methode weitere Parameter
  47. benötigt, können diese durch einen zweiten, optionalen Parameter des Typs
  48. <type>Array</type> an <code>call()</code> angegeben werden, wie folgendes
  49. Beispiel zeigt:
  50. </para>
  51. <example id="zend.xmlrpc.client.method-calls.example-2">
  52. <title>XML-RPC Methodenaufruf mit Parametern</title>
  53. <programlisting language="php"><![CDATA[
  54. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  55. $arg1 = 1.1;
  56. $arg2 = 'foo';
  57. $result = $client->call('test.sayHello', array($arg1, $arg2));
  58. // $result ist ein nativer PHP-Typ
  59. ]]></programlisting>
  60. </example>
  61. <para>
  62. Wenn die entfernte Methode keine Parameter erwartet, kann der
  63. optionale Parameter weggelassen oder stattdessen ein leeres
  64. <code>array()</code> übergeben werden. Das, die Parameter -
  65. für die entfernte Methode - enthaltende, Array kann native
  66. PHP-Typen, <classname>Zend_XmlRpc_Value</classname>-Objekte oder eine
  67. Mischung aus Beidem enthalten.
  68. </para>
  69. <para>
  70. Die <code>call()</code>-Methode konvertiert automatisch die
  71. XML-RPC-Antwort in dessen äquivalenten nativen PHP-Typen und
  72. gibt sie zurück. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt
  73. als Rückgabewert ist auch verfübar durch das Aufrufen der
  74. Methode <code>getLastResponse()</code> nach dem Aufruf (der
  75. entfernten Methode).
  76. </para>
  77. </sect2>
  78. <sect2 id="zend.xmlrpc.value.parameters">
  79. <title>Typen und Konvertierung</title>
  80. <para>
  81. Einige entfernte Methodenaufrufe benötigen Parameter. Diese werden
  82. an die Methode <code>call()</code> des <classname>Zend_XmlRpc_Client</classname>s
  83. als Array im zweiten Parameter übergeben. Jeder Parameter kann
  84. entweder ein nativer PHP-Typ sein, der automatisch konvertiert wird,
  85. oder ein Objekt, das einem speziellen XML-RPC-Typen (eines der
  86. <classname>Zend_XmlRpc_Value</classname>-Objekte) entspricht.
  87. </para>
  88. <sect3 id="zend.xmlrpc.value.parameters.php-native">
  89. <title>Native PHP-Typen als Parameter</title>
  90. <para>
  91. Parameter können der Methode <code>call()</code> als native
  92. PHP-Variablen übergeben werden, also als <type>String</type>,
  93. <code>integer</code>, <code>float</code>,
  94. <type>Boolean</type>, <type>Array</type> oder als ein
  95. <code>Objekt</code>. In diesem Fall wird jeder native PHP-Typ
  96. automatisch erkannt und dann in sein entsprechendes Pendant
  97. konvertiert, welches in dieser Tabelle ersichtlich ist:
  98. </para>
  99. <table id="zend.xmlrpc.value.parameters.php-native.table-1">
  100. <title>PHP- und XML-RPC-Typkonvertierungen</title>
  101. <tgroup cols="2">
  102. <thead>
  103. <row>
  104. <entry>Nativer PHP-Typ</entry>
  105. <entry>XML-RPC Typ</entry>
  106. </row>
  107. </thead>
  108. <tbody>
  109. <row>
  110. <entry>integer</entry>
  111. <entry>int</entry>
  112. </row>
  113. <row>
  114. <entry>double</entry>
  115. <entry>double</entry>
  116. </row>
  117. <row>
  118. <entry>boolean</entry>
  119. <entry>boolean</entry>
  120. </row>
  121. <row>
  122. <entry>string</entry>
  123. <entry>string</entry>
  124. </row>
  125. <row>
  126. <entry>array</entry>
  127. <entry>array</entry>
  128. </row>
  129. <row>
  130. <entry>associative array</entry>
  131. <entry>struct</entry>
  132. </row>
  133. <row>
  134. <entry>object</entry>
  135. <entry>array</entry>
  136. </row>
  137. </tbody>
  138. </tgroup>
  139. </table>
  140. <note>
  141. <title>Auf welchen Typ werden leere Arrays gecastet?</title>
  142. <para>
  143. Die Übergabe eines leeren Array an eine XML-RPC Methode ist problematisch, da es
  144. entweder ein Array oder ein Struct repräsentieren könnte.
  145. <classname>Zend_XmlRpc_Client</classname> erkennt solche Konditionen und führt
  146. eine Abfrage zur <code>system.methodSignature</code> Methode des Servers aus, um
  147. den richtigen XML-RPC Typ festzustellen auf den gecastet werden soll.
  148. </para>
  149. <para>
  150. Trotzdem kann das selbst sogar zu Problemen führen. Erstens werden Server die
  151. <code>system.methodSignature</code> nicht unterstützen fehlerhafte Anfragen
  152. protokollieren, und <classname>Zend_XmlRpc_Client</classname> wird selbst einen
  153. Ausweg nehmen und den Wert auf ein Array casten. Zusätzlich bedeutet das das
  154. jeder Aufruf mit einem Array Argument zu einem zusätzlichen Aufruf beim Remote
  155. Server führt.
  156. </para>
  157. <para>
  158. Um das Nachsehen komplett abzuschalten kann die
  159. <code>setSkipSystemLookup()</code> Methode aufgerufen werden bevor der XML-RPC
  160. Aufruf durchgeführt wird:
  161. </para>
  162. <programlisting language="php"><![CDATA[
  163. $client->setSkipSystemLookup(true);
  164. $result = $client->call('foo.bar', array(array()));
  165. ]]></programlisting>
  166. </note>
  167. </sect3>
  168. <sect3 id="zend.xmlrpc.value.parameters.xmlrpc-value">
  169. <title>Zend_XmlRpc_Value-Objekte als Parameter</title>
  170. <para>
  171. Parameter können auch direkt als <classname>Zend_XmlRpc_Value</classname>-Instanzen
  172. erstellt werden, um einen exakten XML-RPC-Typen darzustellen. Die
  173. wichtigsten Gründe dafür sind:
  174. <itemizedlist>
  175. <listitem>
  176. <para>
  177. Wenn sichergestellt werden soll, dass der Prozedur der
  178. korrekte Parametertyp übergeben wird (z.B. braucht die
  179. Prozedur einen integer, während diese vielleicht
  180. von einer Datenbank als String zurückgegeben wird).
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. Wenn die Prozedur einen <code>base64</code>- oder einen
  186. <code>dateTime.iso8601</code>-Typ benötigt, da diese
  187. nicht als native PHP-Typen existieren.
  188. </para>
  189. </listitem>
  190. <listitem>
  191. <para>
  192. Wenn eine automatische Konvertierung fehlschlägt.
  193. Z.B. wenn eine leere XML-RPC-Struktur als
  194. Parameter für die Prozedur gewünscht ist. Leere Strukturen werden jedoch
  195. als leere Arrays in PHP gehandhabt, was bei einer Übergabe
  196. des leeren Arrays dazu führen würde, dass es zu einem
  197. Array konvertiert wird, da es kein assoziatives Array ist.
  198. </para>
  199. </listitem>
  200. </itemizedlist>
  201. </para>
  202. <para>
  203. Es gibt zwei Möglichkeiten ein <classname>Zend_XmlRpc_Value</classname>-Objekt
  204. zu erstellen: Direkte Instanzierung einer
  205. <classname>Zend_XmlRpc_Value</classname>-Subklasse oder das Nutzen der statischen
  206. Fabrikmethode <classname>Zend_XmlRpc_Value::getXmlRpcValue()</classname>.
  207. </para>
  208. <table id="zend.xmlrpc.value.parameters.xmlrpc-value.table-1">
  209. <title>Zend_XmlRpc_Value Objekte als XML-RPC Typen</title>
  210. <tgroup cols="3">
  211. <thead>
  212. <row>
  213. <entry>XML-RPC Typ</entry>
  214. <entry><classname>Zend_XmlRpc_Value</classname> Konstante</entry>
  215. <entry><classname>Zend_XmlRpc_Value</classname> Objekt</entry>
  216. </row>
  217. </thead>
  218. <tbody>
  219. <row>
  220. <entry>int</entry>
  221. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER</classname></entry>
  222. <entry><classname>Zend_XmlRpc_Value_Integer</classname></entry>
  223. </row>
  224. <row>
  225. <entry>double</entry>
  226. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE</classname></entry>
  227. <entry><classname>Zend_XmlRpc_Value_Double</classname></entry>
  228. </row>
  229. <row>
  230. <entry>boolean</entry>
  231. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN</classname></entry>
  232. <entry><classname>Zend_XmlRpc_Value_Boolean</classname></entry>
  233. </row>
  234. <row>
  235. <entry>string</entry>
  236. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_STRING</classname></entry>
  237. <entry><classname>Zend_XmlRpc_Value_String</classname></entry>
  238. </row>
  239. <row>
  240. <entry>base64</entry>
  241. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64</classname></entry>
  242. <entry><classname>Zend_XmlRpc_Value_Base64</classname></entry>
  243. </row>
  244. <row>
  245. <entry>dateTime.iso8601</entry>
  246. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME</classname></entry>
  247. <entry><classname>Zend_XmlRpc_Value_DateTime</classname></entry>
  248. </row>
  249. <row>
  250. <entry>array</entry>
  251. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY</classname></entry>
  252. <entry><classname>Zend_XmlRpc_Value_Array</classname></entry>
  253. </row>
  254. <row>
  255. <entry>struct</entry>
  256. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT</classname></entry>
  257. <entry><classname>Zend_XmlRpc_Value_Struct</classname></entry>
  258. </row>
  259. </tbody>
  260. </tgroup>
  261. </table>
  262. <para>
  263. <note>
  264. <title>Automatische Konvertierung</title>
  265. <para>
  266. Bei der Erstellung eines neuen
  267. <classname>Zend_XmlRpc_Value</classname>-Objekts wird dessen Wert durch
  268. einen nativen PHP-Typ gesetzt. Dieser PHP-Typ wird durch
  269. PHP-Casting in den gewünschten Typ umgewandelt. Beispielsweise
  270. wird ein String, der als Wert für ein
  271. <classname>Zend_XmlRpc_Value_Integer</classname>-Objekt genutzt wird,
  272. durch <code>(int)$value</code> in ein Integer konvertiert.
  273. </para>
  274. </note>
  275. </para>
  276. </sect3>
  277. </sect2>
  278. <sect2 id="zend.xmlrpc.client.requests-and-responses">
  279. <title>Server-Proxy-Objekt</title>
  280. <para>
  281. Ein anderer Weg um entfernte Methoden mittels des XML-RPC-Clients
  282. aufzurufen, wird durch die Benutzung des Server-Proxys eröffnet.
  283. Dies ist ein PHP-Objekt, das einen entfernten XML-RPC Namensraum
  284. umleitet, sodass es möglichst so aussieht, als würde ein natives
  285. PHP-Objekt angesprochen werden statt des XML-RPC-Services.
  286. </para>
  287. <para>
  288. Um einen Server-Proxy zu instanzieren, muss die Methode
  289. <code>getProxy()</code> der Klasse <classname>Zend_XmlRpc_Client</classname>
  290. aufgerufen werden. Das retourniert eine Instanz von
  291. <classname>Zend_XmlRpc_Client_ServerProxy</classname>. Jeder Methodenaufruf
  292. wird zur entsprechenden entfernten Methode weitergeleitet. Die
  293. Parameter können übergeben werden, wie bei jeder anderen PHP-Methode.
  294. </para>
  295. <example id="zend.xmlrpc.client.requests-and-responses.example-1">
  296. <title>Umleitung zum Standard-Namenraum</title>
  297. <programlisting language="php"><![CDATA[
  298. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  299. $server = $client->getProxy(); // Umleitung im Standard-Namenraum
  300. $hello = $server->test->sayHello(1, 2); // test.Hello(1, 2) gibt "hello" zurück
  301. ]]></programlisting>
  302. </example>
  303. <para>
  304. Die Methode <code>getProxy()</code> erhält ein optionales Argument,
  305. welches den Namensraum des entfernten Servers definiert, zu welchem
  306. die Methodenaufrufe umgeleitet werden. Wenn kein Namensraum übergeben
  307. wird, wird zum Standard-Namensraum umgeleitet. Im nächsten Beispiel
  308. wird zum <code>test</code>-Namensraum umgeleitet:
  309. </para>
  310. <example id="zend.xmlrpc.client.requests-and-responses.example-2">
  311. <title>Umleitung zu einem beliebigen Namensraum</title>
  312. <programlisting language="php"><![CDATA[
  313. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  314. $test = $client->getProxy('test'); // Leitet zum "test"-Namensraum um
  315. $hello = $test->sayHello(1, 2); // test.Hello(1,2) gibt "hello" zurück
  316. ]]></programlisting>
  317. </example>
  318. <para>
  319. Wenn der entfernte Server verschachtelte Namensräume jeglicher
  320. Tiefe erlaubt, können diese auch durch den Server-Proxy genutzt
  321. werden. Wenn der Server in obigem Beispiel eine Methode
  322. <code>test.foo.bar()</code> hätte, könnte es durch
  323. <code>$test->foo->bar()</code> aufgerufen werden.
  324. </para>
  325. </sect2>
  326. <sect2 id="zend.xmlrpc.client.error-handling">
  327. <title>Fehlerbehandlung</title>
  328. <para>
  329. Es gibt zwei Arten von Fehlern, die während eines XML-RPC Methodenaufruf
  330. autreten können: HTTP- und XML-RPC-Fehler. Der <classname>Zend_XmlRpc_Client</classname>
  331. erkennt beide und ermöglicht es, diese unabhängig voneinander zu
  332. entdecken und abzufangen.
  333. </para>
  334. <sect3 id="zend.xmlrpc.client.error-handling.http">
  335. <title>HTTP-Fehler</title>
  336. <para>
  337. Wenn ein HTTP-Fehler auftritt, wie z.B. wenn der entfernte
  338. HTTP-Server einen <code>404 Not Found</code> zurückgibt, wird eine
  339. <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen.
  340. </para>
  341. <example id="zend.xmlrpc.client.error-handling.http.example-1">
  342. <title>Verarbeiten von HTTP-Fehlern</title>
  343. <programlisting language="php"><![CDATA[
  344. $client = new Zend_XmlRpc_Client('http://foo/404');
  345. try {
  346. $client->call('bar', array($arg1, $arg2));
  347. } catch (Zend_XmlRpc_Client_HttpException $e) {
  348. // $e->getCode() gibt 404 zurück
  349. // $e->getMessage() gibt "Not Found" zurück
  350. }
  351. ]]></programlisting>
  352. </example>
  353. <para>
  354. Ungeachtet des benutzten XML-RPC-Clients wird immer eine
  355. <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen, wenn
  356. ein HTTP-Fehler auftritt.
  357. </para>
  358. </sect3>
  359. <sect3 id="zend.xmlrpc.client.error-handling.faults">
  360. <title>XML-RPC-Fehler</title>
  361. <para>
  362. Ein XML-RPC-Fehler wird analog zu einer PHP-Exception verwendet.
  363. Es ist ein spezieller Typ, der durch einen XML-RPC-Methodenaufruf
  364. zurückgegeben wurden und einen Fehlercode sowie eine -meldung
  365. enthält. XML-RPC-Fehler werden unterschiedlich behandelt, was
  366. von der Benutzung des <classname>Zend_XmlRpc_Client</classname>s abhängt.
  367. </para>
  368. <para>
  369. Wenn die Methode <code>call()</code> oder der Server-Proxy genutzt
  370. wird, würde durch einen XML-RPC-Fehler eine
  371. <classname>Zend_XmlRpc_Client_FaultException</classname> geworfen werden. Der
  372. Fehlercode und die -meldung der Exception zeigen auf deren zugehörige
  373. Werte in der originalen XML-RPC-Fehlerantwort.
  374. </para>
  375. <example id="zend.xmlrpc.client.error-handling.faults.example-1">
  376. <title>Verarbeiten von XML-RPC Fehlern</title>
  377. <programlisting language="php"><![CDATA[
  378. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  379. try {
  380. $client->call('badMethod');
  381. } catch (Zend_XmlRpc_Client_FaultException $e) {
  382. // $e->getCode() gibt 1 zurück
  383. // $e->getMessage() gibt "Unknown method" zurück
  384. }
  385. ]]></programlisting>
  386. </example>
  387. <para>
  388. Wenn die Methode <code>call()</code> genutzt wird, um eine Anfrage zu starten, wird
  389. die <classname>Zend_XmlRpc_Client_FaultException</classname> bei einem Fehler
  390. geworfen. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt, das den Fehler
  391. enthält, ist allerdings auch verfübar durch die Methode
  392. <code>getLastResponse()</code>.
  393. </para>
  394. <para>
  395. Wenn die Methode <code>doRequest()</code> genutzt wird, um eine
  396. Anfrage zu starten, wird keine Exception geworfen. Stattdessen
  397. wird ein <classname>Zend_XmlRpc_Response</classname>-Objekt zurückgegeben,
  398. das den Fehler enthält. Dieses kann durch den Aufruf der Methode
  399. <code>isFault()</code> der Klasse <classname>Zend_XmlRpc_Response</classname>
  400. überprüft werden.
  401. </para>
  402. </sect3>
  403. </sect2>
  404. <sect2 id="zend.xmlrpc.client.introspection">
  405. <title>Server Selbstüberprüfung</title>
  406. <para>
  407. Einige XML-RPC Server bieten de facto Überprüfungsmethoden unter dem XML-RPC
  408. Namesraum <code>system.</code>. <classname>Zend_XmlRpc_Client</classname> stellt
  409. spezielle Verfahren für Server mit diesen Möglichkeiten zur Verfügung.
  410. </para>
  411. <para>
  412. Eine Instanz der Klasse <classname>Zend_XmlRpc_Client_ServerIntrospection</classname>
  413. kann über die Methode <code>getIntrospector()</code> der Klasse
  414. <classname>Zend_XmlRpcClient</classname> zurückgegeben werden. Sie kann dann genutzt
  415. werden, um Überwachungsoperationen auf dem Server auszuführen.
  416. </para>
  417. </sect2>
  418. <sect2 id="zend.xmlrpc.client.request-to-response">
  419. <title>Von der Anfrage zur Antwort</title>
  420. <para>
  421. Intern erstellt die Methode <code>call()</code> des
  422. <classname>Zend_XmlRpc_Client</classname>-Objekts ein Anfrage-Objekt
  423. (<classname>Zend_XmlRpc_Request</classname>) und sendet es zu einer anderen
  424. Methode, <code>doRequest()</code>, die ein Antwort-Objekt
  425. (<classname>Zend_XmlRpc_Response</classname>) zurückgibt.
  426. </para>
  427. <para>
  428. Die Methode <code>doRequest()</code> kann auch direkt genutzt werden:
  429. </para>
  430. <example id="zend.xmlrpc.client.request-to-response.example-1">
  431. <title>Eine Anfrage zu einer Antwort verarbeiten</title>
  432. <programlisting language="php"><![CDATA[
  433. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  434. $request = new Zend_XmlRpc_Request();
  435. $request->setMethod('test.sayHello');
  436. $request->setParams(array('foo', 'bar'));
  437. $client->doRequest($request);
  438. // $server->getLastRequest() gibt ein Zend_XmlRpc_Request-Objekt zurück
  439. // $server->getLastResponse() gibt ein Zend_XmlRpc_Response-Objekt zurück
  440. ]]></programlisting>
  441. </example>
  442. <para>
  443. Immer wenn eine XML-RPC-Methode vom Client aufgerufen wird,
  444. egal auf welche Weise - entweder über die Methode <code>call()</code>,
  445. die Methode <code>doRequest()</code> oder den Server-Proxy -, ist das
  446. Objekt der letzten Anfrage, sowie dessen resultierende Antwort-Objekte,
  447. immer durch die Methoden <code>getLastRequest()</code> und
  448. <code>getLastResponse()</code> verfügbar.
  449. </para>
  450. </sect2>
  451. <sect2 id="zend.xmlrpc.client.http-client">
  452. <title>HTTP-Client und das Testen</title>
  453. <para>
  454. In jedem der vorangegangenen Beispiele wurde kein HTTP-Client
  455. bestimmt. In diesem Fall wird eine neue Instanz eines
  456. <classname>Zend_Http_Client</classname>s mit dessen standardmäßigen
  457. Einstellungen erstellt und automatisch vom <classname>Zend_XmlRpc_Client</classname>
  458. benutzt.
  459. </para>
  460. <para>
  461. Der HTTP-Client kann zu jeder Zeit mit der Methode
  462. <code>getHttpClient()</code> zurückgegeben werden. In den meisten
  463. Fällen jedoch ist der Standard-HTTP-Client ausreichend. Allerdings
  464. erlaubt die Methode <code>setHttpClient()</code> das Setzen eines
  465. anderen HTTP-Clients.
  466. </para>
  467. <para>
  468. Die Methode <code>setHttpClient()</code> ist besonders nützlich für
  469. UnitTests. Wenn es mit dem <classname>Zend_Http_Client_Adapter_Test</classname>
  470. kombiniert wird, können entfernte Services für das Testen nachgeahmt werden.
  471. In den UnitTests für <classname>Zend_XmlRpc_Client</classname> sind Beispiele,
  472. wie so was erreicht werden kann.
  473. </para>
  474. </sect2>
  475. </sect1>
  476. <!--
  477. vim:se ts=4 sw=4 et:
  478. -->