Zend_XmlRpc_Client.xml 27 KB

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