Zend_XmlRpc_Client.xml 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  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. ]]>
  37. </programlisting>
  38. </example>
  39. <para>
  40. Der - durch den Aufruf einer entfernten Methode - zurückgegebene, typenlose
  41. XML-RPC Wert wird automatisch zu dessen nativen PHP-Äquivalent umgeformt.
  42. In obigem Beispiel wird ein <code>string</code> zurückgegeben und ist
  43. sofort benutzbar.
  44. </para>
  45. <para>
  46. Der erste Parameter the Methode <code>call()</code> ist der Name der
  47. aufzurufenden Methode. Wenn die entfernte Methode weitere Parameter
  48. benötigt, können diese durch einen zweiten, optionalen Parameter des Typs
  49. <code>array</code> an <code>call()</code> angegeben werden, wie folgendes
  50. Beispiel zeigt:
  51. </para>
  52. <example id="zend.xmlrpc.client.method-calls.example-2">
  53. <title>XML-RPC Methodenaufruf mit Parametern</title>
  54. <programlisting role="php"><![CDATA[
  55. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  56. $arg1 = 1.1;
  57. $arg2 = 'foo';
  58. $result = $client->call('test.sayHello', array($arg1, $arg2));
  59. // $result ist ein nativer PHP-Typ
  60. ]]>
  61. </programlisting>
  62. </example>
  63. <para>
  64. Wenn die entfernte Methode keine Parameter erwartet, kann der
  65. optionale Parameter weggelassen oder stattdessen ein leeres
  66. <code>array()</code> übergeben werden. Das, die Parameter -
  67. für die entfernte Methode - enthaltende, Array kann native
  68. PHP-Typen, <classname>Zend_XmlRpc_Value</classname>-Objekte oder eine
  69. Mischung aus Beidem enthalten.
  70. </para>
  71. <para>
  72. Die <code>call()</code>-Methode konvertiert automatisch die
  73. XML-RPC-Antwort in dessen äquivalenten nativen PHP-Typen und
  74. gibt sie zurück. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt
  75. als Rückgabewert ist auch verfübar durch das Aufrufen der
  76. Methode <code>getLastResponse()</code> nach dem Aufruf (der
  77. entfernten Methode).
  78. </para>
  79. </sect2>
  80. <sect2 id="zend.xmlrpc.value.parameters">
  81. <title>Typen und Konvertierung</title>
  82. <para>
  83. Einige entfernte Methodenaufrufe benötigen Parameter. Diese werden
  84. an die Methode <code>call()</code> des <classname>Zend_XmlRpc_Client</classname>s
  85. als Array im zweiten Parameter übergeben. Jeder Parameter kann
  86. entweder ein nativer PHP-Typ sein, der automatisch konvertiert wird,
  87. oder ein Objekt, das einem speziellen XML-RPC-Typen (eines der
  88. <classname>Zend_XmlRpc_Value</classname>-Objekte) entspricht.
  89. </para>
  90. <sect3 id="zend.xmlrpc.value.parameters.php-native">
  91. <title>Native PHP-Typen als Parameter</title>
  92. <para>
  93. Parameter können der Methode <code>call()</code> als native
  94. PHP-Variablen übergeben werden, also als <code>string</code>,
  95. <code>integer</code>, <code>float</code>,
  96. <code>boolean</code>, <code>array</code> oder als ein
  97. <code>Objekt</code>. In diesem Fall wird jeder native PHP-Typ
  98. automatisch erkannt und dann in sein entsprechendes Pendant
  99. konvertiert, welches in dieser Tabelle ersichtlich ist:
  100. </para>
  101. <table id="zend.xmlrpc.value.parameters.php-native.table-1">
  102. <title>PHP- und XML-RPC-Typkonvertierungen</title>
  103. <tgroup cols="2">
  104. <thead>
  105. <row>
  106. <entry>Nativer PHP-Typ</entry>
  107. <entry>XML-RPC Typ</entry>
  108. </row>
  109. </thead>
  110. <tbody>
  111. <row>
  112. <entry>integer</entry>
  113. <entry>int</entry>
  114. </row>
  115. <row>
  116. <entry>double</entry>
  117. <entry>double</entry>
  118. </row>
  119. <row>
  120. <entry>boolean</entry>
  121. <entry>boolean</entry>
  122. </row>
  123. <row>
  124. <entry>string</entry>
  125. <entry>string</entry>
  126. </row>
  127. <row>
  128. <entry>array</entry>
  129. <entry>array</entry>
  130. </row>
  131. <row>
  132. <entry>associative array</entry>
  133. <entry>struct</entry>
  134. </row>
  135. <row>
  136. <entry>object</entry>
  137. <entry>array</entry>
  138. </row>
  139. </tbody>
  140. </tgroup>
  141. </table>
  142. <note>
  143. <title>Auf welchen Typ werden leere Arrays gecastet?</title>
  144. <para>
  145. Die Übergabe eines leeren Array an eine XML-RPC Methode ist problematisch, da es entweder
  146. ein Array oder ein Struct repräsentieren könnte. <classname>Zend_XmlRpc_Client</classname> erkennt
  147. solche Konditionen und führt eine Abfrage zur <code>system.methodSignature</code> Methode
  148. des Servers aus, um den richtigen XML-RPC Typ festzustellen auf den gecastet werden soll.
  149. </para>
  150. <para>
  151. Trotzdem kann das selbst sogar zu Problemen führen. Erstens werden Server die
  152. <code>system.methodSignature</code> nicht unterstützen fehlerhafte Anfragen protokollieren,
  153. und <classname>Zend_XmlRpc_Client</classname> wird selbst einen Ausweg nehmen und den Wert auf ein
  154. Array casten. Zusätzlich bedeutet das das jeder Aufruf mit einem Array Argument zu einem
  155. zusätzlichen Aufruf beim Remote Server führt.
  156. </para>
  157. <para>
  158. Um das Nachsehen komplett abzuschalten kann die <code>setSkipSystemLookup()</code>
  159. Methode aufgerufen werden bevor der XML-RPC Aufruf durchgeführt wird:
  160. </para>
  161. <programlisting role="php"><![CDATA[
  162. $client->setSkipSystemLookup(true);
  163. $result = $client->call('foo.bar', array(array()));
  164. ]]>
  165. </programlisting>
  166. </note>
  167. </sect3>
  168. <sect3 id="zend.xmlrpc.value.parameters.xmlrpc-value">
  169. <title><classname>Zend_XmlRpc_Value</classname>-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><classname>Zend_XmlRpc_Value</classname> 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 role="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. ]]>
  302. </programlisting>
  303. </example>
  304. <para>
  305. Die Methode <code>getProxy()</code> erhält ein optionales Argument,
  306. welches den Namensraum des entfernten Servers definiert, zu welchem
  307. die Methodenaufrufe umgeleitet werden. Wenn kein Namensraum übergeben
  308. wird, wird zum Standard-Namensraum umgeleitet. Im nächsten Beispiel
  309. wird zum <code>test</code>-Namensraum umgeleitet:
  310. </para>
  311. <example id="zend.xmlrpc.client.requests-and-responses.example-2">
  312. <title>Umleitung zu einem beliebigen Namensraum</title>
  313. <programlisting role="php"><![CDATA[
  314. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  315. $test = $client->getProxy('test'); // Leitet zum "test"-Namensraum um
  316. $hello = $test->sayHello(1, 2); // test.Hello(1,2) gibt "hello" zurück
  317. ]]>
  318. </programlisting>
  319. </example>
  320. <para>
  321. Wenn der entfernte Server verschachtelte Namensräume jeglicher
  322. Tiefe erlaubt, können diese auch durch den Server-Proxy genutzt
  323. werden. Wenn der Server in obigem Beispiel eine Methode
  324. <code>test.foo.bar()</code> hätte, könnte es durch
  325. <code>$test->foo->bar()</code> aufgerufen werden.
  326. </para>
  327. </sect2>
  328. <sect2 id="zend.xmlrpc.client.error-handling">
  329. <title>Fehlerbehandlung</title>
  330. <para>
  331. Es gibt zwei Arten von Fehlern, die während eines XML-RPC Methodenaufruf
  332. autreten können: HTTP- und XML-RPC-Fehler. Der <classname>Zend_XmlRpc_Client</classname>
  333. erkennt beide und ermöglicht es, diese unabhängig voneinander zu
  334. entdecken und abzufangen.
  335. </para>
  336. <sect3 id="zend.xmlrpc.client.error-handling.http">
  337. <title>HTTP-Fehler</title>
  338. <para>
  339. Wenn ein HTTP-Fehler auftritt, wie z.B. wenn der entfernte
  340. HTTP-Server einen <code>404 Not Found</code> zurückgibt, wird eine
  341. <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen.
  342. </para>
  343. <example id="zend.xmlrpc.client.error-handling.http.example-1">
  344. <title>Verarbeiten von HTTP-Fehlern</title>
  345. <programlisting role="php"><![CDATA[
  346. $client = new Zend_XmlRpc_Client('http://foo/404');
  347. try {
  348. $client->call('bar', array($arg1, $arg2));
  349. } catch (Zend_XmlRpc_Client_HttpException $e) {
  350. // $e->getCode() gibt 404 zurück
  351. // $e->getMessage() gibt "Not Found" zurück
  352. }
  353. ]]>
  354. </programlisting>
  355. </example>
  356. <para>
  357. Ungeachtet des benutzten XML-RPC-Clients wird immer eine
  358. <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen, wenn
  359. ein HTTP-Fehler auftritt.
  360. </para>
  361. </sect3>
  362. <sect3 id="zend.xmlrpc.client.error-handling.faults">
  363. <title>XML-RPC-Fehler</title>
  364. <para>
  365. Ein XML-RPC-Fehler wird analog zu einer PHP-Exception verwendet.
  366. Es ist ein spezieller Typ, der durch einen XML-RPC-Methodenaufruf
  367. zurückgegeben wurden und einen Fehlercode sowie eine -meldung
  368. enthält. XML-RPC-Fehler werden unterschiedlich behandelt, was
  369. von der Benutzung des <classname>Zend_XmlRpc_Client</classname>s abhängt.
  370. </para>
  371. <para>
  372. Wenn die Methode <code>call()</code> oder der Server-Proxy genutzt
  373. wird, würde durch einen XML-RPC-Fehler eine
  374. <classname>Zend_XmlRpc_Client_FaultException</classname> geworfen werden. Der
  375. Fehlercode und die -meldung der Exception zeigen auf deren zugehörige
  376. Werte in der originalen XML-RPC-Fehlerantwort.
  377. </para>
  378. <example id="zend.xmlrpc.client.error-handling.faults.example-1">
  379. <title>Verarbeiten von XML-RPC Fehlern</title>
  380. <programlisting role="php"><![CDATA[
  381. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  382. try {
  383. $client->call('badMethod');
  384. } catch (Zend_XmlRpc_Client_FaultException $e) {
  385. // $e->getCode() gibt 1 zurück
  386. // $e->getMessage() gibt "Unknown method" zurück
  387. }
  388. ]]>
  389. </programlisting>
  390. </example>
  391. <para>
  392. Wenn die Methode <code>call()</code> genutzt wird, um eine
  393. Anfrage zu starten, wird die <classname>Zend_XmlRpc_Client_FaultException</classname>
  394. bei einem Fehler geworfen. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt,
  395. das den Fehler enthält, ist allerdings auch verfübar durch die
  396. Methode <code>getLastResponse()</code>.
  397. </para>
  398. <para>
  399. Wenn die Methode <code>doRequest()</code> genutzt wird, um eine
  400. Anfrage zu starten, wird keine Exception geworfen. Stattdessen
  401. wird ein <classname>Zend_XmlRpc_Response</classname>-Objekt zurückgegeben,
  402. das den Fehler enthält. Dieses kann durch den Aufruf der Methode
  403. <code>isFault()</code> der Klasse <classname>Zend_XmlRpc_Response</classname>
  404. überprüft werden.
  405. </para>
  406. </sect3>
  407. </sect2>
  408. <sect2 id="zend.xmlrpc.client.introspection">
  409. <title>Server Selbstüberprüfung</title>
  410. <para>
  411. Einige XML-RPC Server bieten de facto Überprüfungsmethoden unter dem XML-RPC
  412. Namesraum <code>system.</code>. <classname>Zend_XmlRpc_Client</classname> stellt spezielle
  413. Verfahren für Server mit diesen Möglichkeiten zur Verfügung.
  414. </para>
  415. <para>
  416. Eine Instanz der Klasse <classname>Zend_XmlRpc_Client_ServerIntrospection</classname>
  417. kann über die Methode <code>getIntrospector()</code> der Klasse
  418. <classname>Zend_XmlRpcClient</classname> zurückgegeben werden. Sie kann dann genutzt
  419. werden, um Überwachungsoperationen auf dem Server auszuführen.
  420. </para>
  421. </sect2>
  422. <sect2 id="zend.xmlrpc.client.request-to-response">
  423. <title>Von der Anfrage zur Antwort</title>
  424. <para>
  425. Intern erstellt die Methode <code>call()</code> des
  426. <classname>Zend_XmlRpc_Client</classname>-Objekts ein Anfrage-Objekt
  427. (<classname>Zend_XmlRpc_Request</classname>) und sendet es zu einer anderen
  428. Methode, <code>doRequest()</code>, die ein Antwort-Objekt
  429. (<classname>Zend_XmlRpc_Response</classname>) zurückgibt.
  430. </para>
  431. <para>
  432. Die Methode <code>doRequest()</code> kann auch direkt genutzt werden:
  433. </para>
  434. <example id="zend.xmlrpc.client.request-to-response.example-1">
  435. <title>Eine Anfrage zu einer Antwort verarbeiten</title>
  436. <programlisting role="php"><![CDATA[
  437. $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  438. $request = new Zend_XmlRpc_Request();
  439. $request->setMethod('test.sayHello');
  440. $request->setParams(array('foo', 'bar'));
  441. $client->doRequest($request);
  442. // $server->getLastRequest() gibt ein Zend_XmlRpc_Request-Objekt zurück
  443. // $server->getLastResponse() gibt ein Zend_XmlRpc_Response-Objekt zurück
  444. ]]>
  445. </programlisting>
  446. </example>
  447. <para>
  448. Immer wenn eine XML-RPC-Methode vom Client aufgerufen wird,
  449. egal auf welche Weise - entweder über die Methode <code>call()</code>,
  450. die Methode <code>doRequest()</code> oder den Server-Proxy -, ist das
  451. Objekt der letzten Anfrage, sowie dessen resultierende Antwort-Objekte,
  452. immer durch die Methoden <code>getLastRequest()</code> und
  453. <code>getLastResponse()</code> verfügbar.
  454. </para>
  455. </sect2>
  456. <sect2 id="zend.xmlrpc.client.http-client">
  457. <title>HTTP-Client und das Testen</title>
  458. <para>
  459. In jedem der vorangegangenen Beispiele wurde kein HTTP-Client
  460. bestimmt. In diesem Fall wird eine neue Instanz eines
  461. <classname>Zend_Http_Client</classname>s mit dessen standardmäßigen
  462. Einstellungen erstellt und automatisch vom <classname>Zend_XmlRpc_Client</classname>
  463. benutzt.
  464. </para>
  465. <para>
  466. Der HTTP-Client kann zu jeder Zeit mit der Methode
  467. <code>getHttpClient()</code> zurückgegeben werden. In den meisten
  468. Fällen jedoch ist der Standard-HTTP-Client ausreichend. Allerdings
  469. erlaubt die Methode <code>setHttpClient()</code> das Setzen eines
  470. anderen HTTP-Clients.
  471. </para>
  472. <para>
  473. Die Methode <code>setHttpClient()</code> ist besonders nützlich für
  474. UnitTests. Wenn es mit dem <classname>Zend_Http_Client_Adapter_Test</classname>
  475. kombiniert wird, können entfernte Services für das Testen nachgeahmt werden.
  476. In den UnitTests für <classname>Zend_XmlRpc_Client</classname> sind Beispiele,
  477. wie so was erreicht werden kann.
  478. </para>
  479. </sect2>
  480. </sect1>
  481. <!--
  482. vim:se ts=4 sw=4 et:
  483. -->