Zend_XmlRpc_Client.xml 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15234 -->
  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 <classname>Zend_XmlRpc_Client</classname>
  10. Paket - entfernte XML-RPC-Dienste zu nutzen. Seine wichtigsten Möglichkeiten
  11. beinhalten das automatische Umwandeln zwischen PHP und XML-RPC, ein Server
  12. 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 role="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 <code>string</code> 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. <code>array</code> 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 role="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 <code>string</code>,
  93. <code>integer</code>, <code>float</code>,
  94. <code>boolean</code>, <code>array</code> 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 entweder
  144. ein Array oder ein Struct repräsentieren könnte. <classname>Zend_XmlRpc_Client</classname> erkennt
  145. solche Konditionen und führt eine Abfrage zur <code>system.methodSignature</code> Methode
  146. des Servers aus, um den richtigen XML-RPC Typ festzustellen auf den gecastet werden soll.
  147. </para>
  148. <para>
  149. Trotzdem kann das selbst sogar zu Problemen führen. Erstens werden Server die
  150. <code>system.methodSignature</code> nicht unterstützen fehlerhafte Anfragen protokollieren,
  151. und <classname>Zend_XmlRpc_Client</classname> wird selbst einen Ausweg nehmen und den Wert auf ein
  152. Array casten. Zusätzlich bedeutet das das jeder Aufruf mit einem Array Argument zu einem
  153. zusätzlichen Aufruf beim Remote Server führt.
  154. </para>
  155. <para>
  156. Um das Nachsehen komplett abzuschalten kann die <code>setSkipSystemLookup()</code>
  157. Methode aufgerufen werden bevor der XML-RPC Aufruf durchgeführt wird:
  158. </para>
  159. <programlisting role="php"><![CDATA[
  160. $client->setSkipSystemLookup(true);
  161. $result = $client->call('foo.bar', array(array()));
  162. ]]></programlisting>
  163. </note>
  164. </sect3>
  165. <sect3 id="zend.xmlrpc.value.parameters.xmlrpc-value">
  166. <title>Zend_XmlRpc_Value-Objekte als Parameter</title>
  167. <para>
  168. Parameter können auch direkt als <classname>Zend_XmlRpc_Value</classname>-Instanzen
  169. erstellt werden, um einen exakten XML-RPC-Typen darzustellen. Die
  170. wichtigsten Gründe dafür sind:
  171. <itemizedlist>
  172. <listitem>
  173. <para>
  174. Wenn sichergestellt werden soll, dass der Prozedur der
  175. korrekte Parametertyp übergeben wird (z.B. braucht die
  176. Prozedur einen integer, während diese vielleicht
  177. von einer Datenbank als String zurückgegeben wird).
  178. </para>
  179. </listitem>
  180. <listitem>
  181. <para>
  182. Wenn die Prozedur einen <code>base64</code>- oder einen
  183. <code>dateTime.iso8601</code>-Typ benötigt, da diese
  184. nicht als native PHP-Typen existieren.
  185. </para>
  186. </listitem>
  187. <listitem>
  188. <para>
  189. Wenn eine automatische Konvertierung fehlschlägt.
  190. Z.B. wenn eine leere XML-RPC-Struktur als
  191. Parameter für die Prozedur gewünscht ist. Leere Strukturen werden jedoch
  192. als leere Arrays in PHP gehandhabt, was bei einer Übergabe
  193. des leeren Arrays dazu führen würde, dass es zu einem
  194. Array konvertiert wird, da es kein assoziatives Array ist.
  195. </para>
  196. </listitem>
  197. </itemizedlist>
  198. </para>
  199. <para>
  200. Es gibt zwei Möglichkeiten ein <classname>Zend_XmlRpc_Value</classname>-Objekt
  201. zu erstellen: Direkte Instanzierung einer
  202. <classname>Zend_XmlRpc_Value</classname>-Subklasse oder das Nutzen der statischen
  203. Fabrikmethode <classname>Zend_XmlRpc_Value::getXmlRpcValue()</classname>.
  204. </para>
  205. <table id="zend.xmlrpc.value.parameters.xmlrpc-value.table-1">
  206. <title>Zend_XmlRpc_Value Objekte als XML-RPC Typen</title>
  207. <tgroup cols="3">
  208. <thead>
  209. <row>
  210. <entry>XML-RPC Typ</entry>
  211. <entry><classname>Zend_XmlRpc_Value</classname> Konstante</entry>
  212. <entry><classname>Zend_XmlRpc_Value</classname> Objekt</entry>
  213. </row>
  214. </thead>
  215. <tbody>
  216. <row>
  217. <entry>int</entry>
  218. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER</classname></entry>
  219. <entry><classname>Zend_XmlRpc_Value_Integer</classname></entry>
  220. </row>
  221. <row>
  222. <entry>double</entry>
  223. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE</classname></entry>
  224. <entry><classname>Zend_XmlRpc_Value_Double</classname></entry>
  225. </row>
  226. <row>
  227. <entry>boolean</entry>
  228. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN</classname></entry>
  229. <entry><classname>Zend_XmlRpc_Value_Boolean</classname></entry>
  230. </row>
  231. <row>
  232. <entry>string</entry>
  233. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_STRING</classname></entry>
  234. <entry><classname>Zend_XmlRpc_Value_String</classname></entry>
  235. </row>
  236. <row>
  237. <entry>base64</entry>
  238. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64</classname></entry>
  239. <entry><classname>Zend_XmlRpc_Value_Base64</classname></entry>
  240. </row>
  241. <row>
  242. <entry>dateTime.iso8601</entry>
  243. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME</classname></entry>
  244. <entry><classname>Zend_XmlRpc_Value_DateTime</classname></entry>
  245. </row>
  246. <row>
  247. <entry>array</entry>
  248. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY</classname></entry>
  249. <entry><classname>Zend_XmlRpc_Value_Array</classname></entry>
  250. </row>
  251. <row>
  252. <entry>struct</entry>
  253. <entry><classname>Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT</classname></entry>
  254. <entry><classname>Zend_XmlRpc_Value_Struct</classname></entry>
  255. </row>
  256. </tbody>
  257. </tgroup>
  258. </table>
  259. <para>
  260. <note>
  261. <title>Automatische Konvertierung</title>
  262. <para>
  263. Bei der Erstellung eines neuen
  264. <classname>Zend_XmlRpc_Value</classname>-Objekts wird dessen Wert durch
  265. einen nativen PHP-Typ gesetzt. Dieser PHP-Typ wird durch
  266. PHP-Casting in den gewünschten Typ umgewandelt. Beispielsweise
  267. wird ein String, der als Wert für ein
  268. <classname>Zend_XmlRpc_Value_Integer</classname>-Objekt genutzt wird,
  269. durch <code>(int)$value</code> in ein Integer konvertiert.
  270. </para>
  271. </note>
  272. </para>
  273. </sect3>
  274. </sect2>
  275. <sect2 id="zend.xmlrpc.client.requests-and-responses">
  276. <title>Server-Proxy-Objekt</title>
  277. <para>
  278. Ein anderer Weg um entfernte Methoden mittels des XML-RPC-Clients
  279. aufzurufen, wird durch die Benutzung des Server-Proxys eröffnet.
  280. Dies ist ein PHP-Objekt, das einen entfernten XML-RPC Namensraum
  281. umleitet, sodass es möglichst so aussieht, als würde ein natives
  282. PHP-Objekt angesprochen werden statt des XML-RPC-Services.
  283. </para>
  284. <para>
  285. Um einen Server-Proxy zu instanzieren, muss die Methode
  286. <code>getProxy()</code> der Klasse <classname>Zend_XmlRpc_Client</classname>
  287. aufgerufen werden. Das retourniert eine Instanz von
  288. <classname>Zend_XmlRpc_Client_ServerProxy</classname>. Jeder Methodenaufruf
  289. wird zur entsprechenden entfernten Methode weitergeleitet. Die
  290. Parameter können übergeben werden, wie bei jeder anderen PHP-Methode.
  291. </para>
  292. <example id="zend.xmlrpc.client.requests-and-responses.example-1">
  293. <title>Umleitung zum Standard-Namenraum</title>
  294. <programlisting role="php"><![CDATA[
  295. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  296. $server = $client->getProxy(); // Umleitung im Standard-Namenraum
  297. $hello = $server->test->sayHello(1, 2); // test.Hello(1, 2) gibt "hello" zurück
  298. ]]></programlisting>
  299. </example>
  300. <para>
  301. Die Methode <code>getProxy()</code> erhält ein optionales Argument,
  302. welches den Namensraum des entfernten Servers definiert, zu welchem
  303. die Methodenaufrufe umgeleitet werden. Wenn kein Namensraum übergeben
  304. wird, wird zum Standard-Namensraum umgeleitet. Im nächsten Beispiel
  305. wird zum <code>test</code>-Namensraum umgeleitet:
  306. </para>
  307. <example id="zend.xmlrpc.client.requests-and-responses.example-2">
  308. <title>Umleitung zu einem beliebigen Namensraum</title>
  309. <programlisting role="php"><![CDATA[
  310. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  311. $test = $client->getProxy('test'); // Leitet zum "test"-Namensraum um
  312. $hello = $test->sayHello(1, 2); // test.Hello(1,2) gibt "hello" zurück
  313. ]]></programlisting>
  314. </example>
  315. <para>
  316. Wenn der entfernte Server verschachtelte Namensräume jeglicher
  317. Tiefe erlaubt, können diese auch durch den Server-Proxy genutzt
  318. werden. Wenn der Server in obigem Beispiel eine Methode
  319. <code>test.foo.bar()</code> hätte, könnte es durch
  320. <code>$test->foo->bar()</code> aufgerufen werden.
  321. </para>
  322. </sect2>
  323. <sect2 id="zend.xmlrpc.client.error-handling">
  324. <title>Fehlerbehandlung</title>
  325. <para>
  326. Es gibt zwei Arten von Fehlern, die während eines XML-RPC Methodenaufruf
  327. autreten können: HTTP- und XML-RPC-Fehler. Der <classname>Zend_XmlRpc_Client</classname>
  328. erkennt beide und ermöglicht es, diese unabhängig voneinander zu
  329. entdecken und abzufangen.
  330. </para>
  331. <sect3 id="zend.xmlrpc.client.error-handling.http">
  332. <title>HTTP-Fehler</title>
  333. <para>
  334. Wenn ein HTTP-Fehler auftritt, wie z.B. wenn der entfernte
  335. HTTP-Server einen <code>404 Not Found</code> zurückgibt, wird eine
  336. <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen.
  337. </para>
  338. <example id="zend.xmlrpc.client.error-handling.http.example-1">
  339. <title>Verarbeiten von HTTP-Fehlern</title>
  340. <programlisting role="php"><![CDATA[
  341. $client = new Zend_XmlRpc_Client('http://foo/404');
  342. try {
  343. $client->call('bar', array($arg1, $arg2));
  344. } catch (Zend_XmlRpc_Client_HttpException $e) {
  345. // $e->getCode() gibt 404 zurück
  346. // $e->getMessage() gibt "Not Found" zurück
  347. }
  348. ]]></programlisting>
  349. </example>
  350. <para>
  351. Ungeachtet des benutzten XML-RPC-Clients wird immer eine
  352. <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen, wenn
  353. ein HTTP-Fehler auftritt.
  354. </para>
  355. </sect3>
  356. <sect3 id="zend.xmlrpc.client.error-handling.faults">
  357. <title>XML-RPC-Fehler</title>
  358. <para>
  359. Ein XML-RPC-Fehler wird analog zu einer PHP-Exception verwendet.
  360. Es ist ein spezieller Typ, der durch einen XML-RPC-Methodenaufruf
  361. zurückgegeben wurden und einen Fehlercode sowie eine -meldung
  362. enthält. XML-RPC-Fehler werden unterschiedlich behandelt, was
  363. von der Benutzung des <classname>Zend_XmlRpc_Client</classname>s abhängt.
  364. </para>
  365. <para>
  366. Wenn die Methode <code>call()</code> oder der Server-Proxy genutzt
  367. wird, würde durch einen XML-RPC-Fehler eine
  368. <classname>Zend_XmlRpc_Client_FaultException</classname> geworfen werden. Der
  369. Fehlercode und die -meldung der Exception zeigen auf deren zugehörige
  370. Werte in der originalen XML-RPC-Fehlerantwort.
  371. </para>
  372. <example id="zend.xmlrpc.client.error-handling.faults.example-1">
  373. <title>Verarbeiten von XML-RPC Fehlern</title>
  374. <programlisting role="php"><![CDATA[
  375. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  376. try {
  377. $client->call('badMethod');
  378. } catch (Zend_XmlRpc_Client_FaultException $e) {
  379. // $e->getCode() gibt 1 zurück
  380. // $e->getMessage() gibt "Unknown method" zurück
  381. }
  382. ]]></programlisting>
  383. </example>
  384. <para>
  385. Wenn die Methode <code>call()</code> genutzt wird, um eine
  386. Anfrage zu starten, wird die <classname>Zend_XmlRpc_Client_FaultException</classname>
  387. bei einem Fehler geworfen. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt,
  388. das den Fehler enthält, ist allerdings auch verfübar durch die
  389. Methode <code>getLastResponse()</code>.
  390. </para>
  391. <para>
  392. Wenn die Methode <code>doRequest()</code> genutzt wird, um eine
  393. Anfrage zu starten, wird keine Exception geworfen. Stattdessen
  394. wird ein <classname>Zend_XmlRpc_Response</classname>-Objekt zurückgegeben,
  395. das den Fehler enthält. Dieses kann durch den Aufruf der Methode
  396. <code>isFault()</code> der Klasse <classname>Zend_XmlRpc_Response</classname>
  397. überprüft werden.
  398. </para>
  399. </sect3>
  400. </sect2>
  401. <sect2 id="zend.xmlrpc.client.introspection">
  402. <title>Server Selbstüberprüfung</title>
  403. <para>
  404. Einige XML-RPC Server bieten de facto Überprüfungsmethoden unter dem XML-RPC
  405. Namesraum <code>system.</code>. <classname>Zend_XmlRpc_Client</classname> stellt spezielle
  406. Verfahren für Server mit diesen Möglichkeiten zur Verfügung.
  407. </para>
  408. <para>
  409. Eine Instanz der Klasse <classname>Zend_XmlRpc_Client_ServerIntrospection</classname>
  410. kann über die Methode <code>getIntrospector()</code> der Klasse
  411. <classname>Zend_XmlRpcClient</classname> zurückgegeben werden. Sie kann dann genutzt
  412. werden, um Überwachungsoperationen auf dem Server auszuführen.
  413. </para>
  414. </sect2>
  415. <sect2 id="zend.xmlrpc.client.request-to-response">
  416. <title>Von der Anfrage zur Antwort</title>
  417. <para>
  418. Intern erstellt die Methode <code>call()</code> des
  419. <classname>Zend_XmlRpc_Client</classname>-Objekts ein Anfrage-Objekt
  420. (<classname>Zend_XmlRpc_Request</classname>) und sendet es zu einer anderen
  421. Methode, <code>doRequest()</code>, die ein Antwort-Objekt
  422. (<classname>Zend_XmlRpc_Response</classname>) zurückgibt.
  423. </para>
  424. <para>
  425. Die Methode <code>doRequest()</code> kann auch direkt genutzt werden:
  426. </para>
  427. <example id="zend.xmlrpc.client.request-to-response.example-1">
  428. <title>Eine Anfrage zu einer Antwort verarbeiten</title>
  429. <programlisting role="php"><![CDATA[
  430. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  431. $request = new Zend_XmlRpc_Request();
  432. $request->setMethod('test.sayHello');
  433. $request->setParams(array('foo', 'bar'));
  434. $client->doRequest($request);
  435. // $server->getLastRequest() gibt ein Zend_XmlRpc_Request-Objekt zurück
  436. // $server->getLastResponse() gibt ein Zend_XmlRpc_Response-Objekt zurück
  437. ]]></programlisting>
  438. </example>
  439. <para>
  440. Immer wenn eine XML-RPC-Methode vom Client aufgerufen wird,
  441. egal auf welche Weise - entweder über die Methode <code>call()</code>,
  442. die Methode <code>doRequest()</code> oder den Server-Proxy -, ist das
  443. Objekt der letzten Anfrage, sowie dessen resultierende Antwort-Objekte,
  444. immer durch die Methoden <code>getLastRequest()</code> und
  445. <code>getLastResponse()</code> verfügbar.
  446. </para>
  447. </sect2>
  448. <sect2 id="zend.xmlrpc.client.http-client">
  449. <title>HTTP-Client und das Testen</title>
  450. <para>
  451. In jedem der vorangegangenen Beispiele wurde kein HTTP-Client
  452. bestimmt. In diesem Fall wird eine neue Instanz eines
  453. <classname>Zend_Http_Client</classname>s mit dessen standardmäßigen
  454. Einstellungen erstellt und automatisch vom <classname>Zend_XmlRpc_Client</classname>
  455. benutzt.
  456. </para>
  457. <para>
  458. Der HTTP-Client kann zu jeder Zeit mit der Methode
  459. <code>getHttpClient()</code> zurückgegeben werden. In den meisten
  460. Fällen jedoch ist der Standard-HTTP-Client ausreichend. Allerdings
  461. erlaubt die Methode <code>setHttpClient()</code> das Setzen eines
  462. anderen HTTP-Clients.
  463. </para>
  464. <para>
  465. Die Methode <code>setHttpClient()</code> ist besonders nützlich für
  466. UnitTests. Wenn es mit dem <classname>Zend_Http_Client_Adapter_Test</classname>
  467. kombiniert wird, können entfernte Services für das Testen nachgeahmt werden.
  468. In den UnitTests für <classname>Zend_XmlRpc_Client</classname> sind Beispiele,
  469. wie so was erreicht werden kann.
  470. </para>
  471. </sect2>
  472. </sect1>
  473. <!--
  474. vim:se ts=4 sw=4 et:
  475. -->