Zend_XmlRpc_Client.xml 29 KB

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