2
0

Zend_XmlRpc_Client.xml 28 KB

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