File: Zend_XmlRpc_Client.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (680 lines) | stat: -rw-r--r-- 29,516 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.xmlrpc.client">
    <title>Zend_XmlRpc_Client</title>

    <sect2 id="zend.xmlrpc.client.introduction">
        <title>Einführung</title>

        <para>
            Zend Framework bietet Unterstützung, als Client - durch das
            <classname>Zend_XmlRpc_Client</classname> Paket - entfernte <acronym>XML-RPC</acronym>
            Dienste zu nutzen. Seine wichtigsten Möglichkeiten beinhalten das automatische
            Umwandeln zwischen <acronym>PHP</acronym> und <acronym>XML-RPC</acronym>, ein Server
            Proxy-Objekt und den Zugriff auf Server-Prüfungsmöglichkeiten.
        </para>
    </sect2>

    <sect2 id="zend.xmlrpc.client.method-calls">
        <title>Methodenaufrufe</title>

        <para>
            Der Konstruktor von <classname>Zend_XmlRpc_Client</classname> erhält den
            <acronym>URL</acronym> des Endpunktes des entfernten <acronym>XML-RPC</acronym> Server
            als ersten Parameter. Die zurückgegebene Instanz kann genutzt werden, um eine beliebige
            Anzahl von entfernten Methoden (des Endpunktes) aufzurufen.
        </para>

        <para>
            Um eine entfernte Methode mittels des <acronym>XML-RPC</acronym> Clients aufzurufen,
            muss man den Client instanzieren und dessen Methode <methodname>call()</methodname>
            aufrufen. Das hierunter gegebene Codebeispiel demonstriert den
            <acronym>XML-RPC</acronym> Server der Zend Framework Webseite. Es kann benutzen, um
            <classname>Zend_XmlRpc</classname>-Komponenten zu testen oder auszuprobieren.
        </para>

        <example id="zend.xmlrpc.client.method-calls.example-1">
            <title>XML-RPC Methodenaufruf</title>

            <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');

echo $client->call('test.sayHello');

// hello
]]></programlisting>
        </example>

        <para>
            Der - durch den Aufruf einer entfernten Methode - zurückgegebene, typenlose
            <acronym>XML-RPC</acronym> Wert wird automatisch zu dessen nativen
            <acronym>PHP</acronym> Äquivalent umgeformt. In obigem Beispiel wird ein
            <acronym>PHP</acronym> <type>String</type> zurückgegeben und ist sofort benutzbar.
        </para>

        <para>
            Der erste Parameter the Methode <methodname>call()</methodname> ist der Name der
            aufzurufenden Methode. Wenn die entfernte Methode weitere Parameter
            benötigt, können diese durch einen zweiten, optionalen Parameter des Typs
            <type>Array</type> an <methodname>call()</methodname> angegeben werden, wie folgendes
            Beispiel zeigt:
        </para>

        <example id="zend.xmlrpc.client.method-calls.example-2">
            <title>XML-RPC Methodenaufruf mit Parametern</title>

            <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');

$arg1 = 1.1;
$arg2 = 'foo';

$result = $client->call('test.sayHello', array($arg1, $arg2));

// $result ist ein nativer PHP-Typ
]]></programlisting>
        </example>

        <para>
            Wenn die entfernte Methode keine Parameter erwartet, kann der
            optionale Parameter weggelassen oder stattdessen ein leeres
            <methodname>array()</methodname> übergeben werden. Das, die Parameter -
            für die entfernte Methode - enthaltende, Array kann native
            <acronym>PHP</acronym> Typen, <classname>Zend_XmlRpc_Value</classname>-Objekte oder
            eine Mischung aus Beidem enthalten.
        </para>

        <para>
            Die <methodname>call()</methodname>-Methode konvertiert automatisch die
            <acronym>XML-RPC</acronym> Antwort in dessen äquivalenten nativen
            <acronym>PHP</acronym> Typen und gibt sie zurück. Ein
            <classname>Zend_XmlRpc_Response</classname> Objekt als Rückgabewert ist auch verfübar
            durch das Aufrufen der Methode <methodname>getLastResponse()</methodname> nach dem
            Aufruf (der entfernten Methode).
        </para>
    </sect2>

    <sect2 id="zend.xmlrpc.value.parameters">
        <title>Typen und Konvertierung</title>

        <para>
            Einige entfernte Methodenaufrufe benötigen Parameter. Diese werden
            an die Methode <methodname>call()</methodname> des
            <classname>Zend_XmlRpc_Client</classname>s als Array im zweiten Parameter übergeben.
            Jeder Parameter kann entweder ein nativer <acronym>PHP</acronym> Typ sein, der
            automatisch konvertiert wird, oder ein Objekt, das einem speziellen
            <acronym>XML-RPC</acronym> Typen (eines der
            <classname>Zend_XmlRpc_Value</classname>-Objekte) entspricht.
        </para>

        <sect3 id="zend.xmlrpc.value.parameters.php-native">
            <title>Native PHP-Typen als Parameter</title>

            <para>
                Parameter können der Methode <methodname>call()</methodname> als native
                <acronym>PHP</acronym> Variablen übergeben werden, also als <type>String</type>,
                <type>Integer</type>, <type>Float</type>,
                <type>Boolean</type>, <type>Array</type> oder als
                <type>Object</type>. In diesem Fall wird jeder native <acronym>PHP</acronym> Typ
                automatisch erkannt und dann in einen der folgenden <acronym>XML-RPC</acronym>
                Typen konvertiert, welche in dieser Tabelle ersichtlich ist:
            </para>

            <table id="zend.xmlrpc.value.parameters.php-native.table-1">
                <title>PHP- und XML-RPC-Typkonvertierungen</title>

                <tgroup cols="2">
                    <thead>
                        <row>
                            <entry>Nativer <acronym>PHP</acronym> Typ</entry>
                            <entry><acronym>XML-RPC</acronym> Typ</entry>
                        </row>
                    </thead>

                    <tbody>
                        <row>
                            <entry>integer</entry>
                            <entry>int</entry>
                        </row>

                        <row>
                            <entry>Zend_Crypt_Math_BigInteger</entry>
                            <entry>i8</entry>
                        </row>

                        <row>
                            <entry>double</entry>
                            <entry>double</entry>
                        </row>

                        <row>
                            <entry>boolean</entry>
                            <entry>boolean</entry>
                        </row>

                        <row>
                            <entry>string</entry>
                            <entry>string</entry>
                        </row>

                        <row>
                            <entry>null</entry>
                            <entry>nil</entry>
                        </row>

                        <row>
                            <entry>array</entry>
                            <entry>array</entry>
                        </row>

                        <row>
                            <entry>associative array</entry>
                            <entry>struct</entry>
                        </row>

                        <row>
                            <entry>object</entry>
                            <entry>array</entry>
                        </row>

                        <row>
                            <entry>Zend_Date</entry>
                            <entry>dateTime.iso8601</entry>
                        </row>

                        <row>
                            <entry>DateTime</entry>
                            <entry>dateTime.iso8601</entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>

            <note>
                <title>Auf welchen Typ werden leere Arrays gecastet?</title>

                <para>
                    Die Übergabe eines leeren Array an eine <acronym>XML-RPC</acronym> Methode ist
                    problematisch, da es entweder ein Array oder ein Struct repräsentieren könnte.
                    <classname>Zend_XmlRpc_Client</classname> erkennt solche Konditionen und führt
                    eine Abfrage zur <command>system.methodSignature</command> Methode des Servers
                    aus, um den richtigen <acronym>XML-RPC</acronym> Typ festzustellen auf den
                    gecastet werden soll.
                </para>

                <para>
                    Trotzdem kann das selbst sogar zu Problemen führen. Erstens werden Server die
                    <command>system.methodSignature</command> nicht unterstützen fehlerhafte
                    Anfragen protokollieren, und <classname>Zend_XmlRpc_Client</classname> wird
                    selbst einen Ausweg nehmen und den Wert auf einen <acronym>XML-RPC</acronym>
                    Arraytyp casten. Zusätzlich bedeutet dass das jeder Aufruf mit einem Array
                    Argument zu einem zusätzlichen Aufruf beim Remote Server führt.
                </para>

                <para>
                    Um das Nachsehen komplett abzuschalten kann die
                    <methodname>setSkipSystemLookup()</methodname> Methode aufgerufen werden bevor
                    der <acronym>XML-RPC</acronym> Aufruf durchgeführt wird:
                </para>

                <programlisting language="php"><![CDATA[
$client->setSkipSystemLookup(true);
$result = $client->call('foo.bar', array(array()));
]]></programlisting>
            </note>
        </sect3>

        <sect3 id="zend.xmlrpc.value.parameters.xmlrpc-value">
            <title>Zend_XmlRpc_Value-Objekte als Parameter</title>

            <para>
                Parameter können auch direkt als <classname>Zend_XmlRpc_Value</classname>-Instanzen
                erstellt werden, um einen exakten <acronym>XML-RPC</acronym> Typen darzustellen.
                Die wichtigsten Gründe dafür sind:

                <itemizedlist>
                    <listitem>
                        <para>
                            Wenn sichergestellt werden soll, dass der Prozedur der
                            korrekte Parametertyp übergeben wird (z.B. braucht die
                            Prozedur einen integer, während diese vielleicht
                            von einer Datenbank als String zurückgegeben wird).
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            Wenn die Prozedur einen <property>base64</property>- oder einen
                            <property>dateTime.iso8601</property>-Typ benötigt, da diese
                            nicht als native <acronym>PHP</acronym> Typen existieren.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            Wenn eine automatische Konvertierung fehlschlägt. Zum Beispiel wenn
                            eine leere <acronym>XML-RPC</acronym> Struktur als Parameter für die
                            Prozedur gewünscht ist. Leere Strukturen werden jedoch als leere Arrays
                            in <acronym>PHP</acronym> gehandhabt, aber wenn man ein leeres Array
                            als Parameter übergeben will, dann wird es automatisch zu einem
                            <acronym>XML-RPC</acronym> Array konvertiert, da es kein assoziatives
                            Array ist.
                        </para>
                    </listitem>
                </itemizedlist>
            </para>

            <para>
                Es gibt zwei Möglichkeiten ein <classname>Zend_XmlRpc_Value</classname>-Objekt
                zu erstellen: Direkte Instanzierung einer
                <classname>Zend_XmlRpc_Value</classname>-Subklasse oder das Nutzen der statischen
                Fabrikmethode <methodname>Zend_XmlRpc_Value::getXmlRpcValue()</methodname>.
            </para>

            <table id="zend.xmlrpc.value.parameters.xmlrpc-value.table-1">
                <title>Zend_XmlRpc_Value Objekte als XML-RPC Typen</title>

                <tgroup cols="3">
                    <thead>
                        <row>
                            <entry><acronym>XML-RPC</acronym> Typ</entry>
                            <entry><classname>Zend_XmlRpc_Value</classname> Konstante</entry>
                            <entry><classname>Zend_XmlRpc_Value</classname> Objekt</entry>
                        </row>
                    </thead>

                    <tbody>
                        <row>
                            <entry>int</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Integer</classname></entry>
                        </row>

                        <row>
                            <entry>i8</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_I8</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_BigInteger</classname></entry>
                        </row>

                        <row>
                            <entry>ex:i8</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_APACHEI8</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_BigInteger</classname></entry>
                        </row>

                        <row>
                            <entry>double</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Double</classname></entry>
                        </row>

                        <row>
                            <entry>boolean</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Boolean</classname></entry>
                        </row>

                        <row>
                            <entry>string</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_STRING</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_String</classname></entry>
                        </row>

                        <row>
                            <entry>nil</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_NIL</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Nil</classname></entry>
                        </row>

                        <row>
                            <entry>ex:nil</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_APACHENIL</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Nil</classname></entry>
                        </row>

                        <row>
                            <entry>base64</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Base64</classname></entry>
                        </row>

                        <row>
                            <entry>dateTime.iso8601</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_DateTime</classname></entry>
                        </row>

                        <row>
                            <entry>array</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Array</classname></entry>
                        </row>

                        <row>
                            <entry>struct</entry>

                            <entry>
                                <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT</constant>
                            </entry>

                            <entry><classname>Zend_XmlRpc_Value_Struct</classname></entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>

            <para>
                <note>
                    <title>Automatische Konvertierung</title>

                    <para>
                        Bei der Erstellung eines neuen
                        <classname>Zend_XmlRpc_Value</classname>-Objekts wird dessen Wert durch
                        einen nativen <acronym>PHP</acronym> Typ gesetzt. Dieser
                        <acronym>PHP</acronym> Typ wird durch <acronym>PHP</acronym> Casting in den
                        gewünschten Typ umgewandelt. Beispielsweise wird ein String, der als Wert
                        für ein <classname>Zend_XmlRpc_Value_Integer</classname>-Objekt genutzt
                        wird, durch <command>(int)$value</command> in ein Integer konvertiert.
                    </para>
                </note>
            </para>
        </sect3>
    </sect2>

    <sect2 id="zend.xmlrpc.client.requests-and-responses">
        <title>Server-Proxy-Objekt</title>

        <para>
            Ein anderer Weg um entfernte Methoden mit <acronym>XML-RPC</acronym> Clients
            aufzurufen, ist die Verwendung eines Server-Proxys. Dies ist ein
            <acronym>PHP</acronym> Objekt, das einen entfernten <acronym>XML-RPC</acronym>
            Namensraum umleitet, sodass es so weit wie möglich als <acronym>PHP</acronym> Objekt
            arbeitet wie es möglich ist.
        </para>

        <para>
            Um einen Server-Proxy zu instanzieren, muss die Methode
            <methodname>getProxy()</methodname> der Klasse <classname>Zend_XmlRpc_Client</classname>
            aufgerufen werden. Das retourniert eine Instanz von
            <classname>Zend_XmlRpc_Client_ServerProxy</classname>. Jeder Methodenaufruf
            wird zur entsprechenden entfernten Methode weitergeleitet. Die Parameter
            können übergeben werden, wie bei jeder anderen <acronym>PHP</acronym> Methode.
        </para>

        <example id="zend.xmlrpc.client.requests-and-responses.example-1">
            <title>Umleitung zum Standard-Namenraum</title>

            <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');

$service = $client->getProxy();          // Umleitung im Standard-Namenraum

$hello = $service->test->sayHello(1, 2); // test.Hello(1, 2) gibt "hello" zurück
]]></programlisting>
        </example>

        <para>
            Die Methode <methodname>getProxy()</methodname> erhält ein optionales Argument,
            welches den Namensraum des entfernten Servers definiert, zu welchem
            die Methodenaufrufe umgeleitet werden. Wenn kein Namensraum übergeben
            wird, wird zum Standard-Namensraum umgeleitet. Im nächsten Beispiel
            wird zum 'test'-Namespace umgeleitet:
        </para>

        <example id="zend.xmlrpc.client.requests-and-responses.example-2">
            <title>Umleitung zu einem beliebigen Namensraum</title>

            <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');

$test  = $client->getProxy('test');     // Leitet zum "test"-Namensraum um

$hello = $test->sayHello(1, 2);         // test.Hello(1,2) gibt "hello" zurück
]]></programlisting>
        </example>

        <para>
            Wenn der entfernte Server verschachtelte Namensräume jeglicher
            Tiefe erlaubt, können diese auch durch den Server-Proxy genutzt
            werden. Wenn der Server in obigem Beispiel eine Methode
            <command>test.foo.bar()</command> hätte, könnte es durch
            <command>$test->foo->bar()</command> aufgerufen werden.
        </para>
    </sect2>

    <sect2 id="zend.xmlrpc.client.error-handling">
        <title>Fehlerbehandlung</title>

        <para>
            Es gibt zwei Arten von Fehlern, die während eines <acronym>XML-RPC</acronym>
            Methodenaufruf autreten können: <acronym>HTTP</acronym> und <acronym>XML-RPC</acronym>
            Fehler. Der <classname>Zend_XmlRpc_Client</classname> erkennt beide und ermöglicht es,
            diese unabhängig voneinander zu entdecken und abzufangen.
        </para>

        <sect3 id="zend.xmlrpc.client.error-handling.http">
            <title>HTTP-Fehler</title>

            <para>
                Wenn ein <acronym>HTTP</acronym> Fehler auftritt, wie z.B. wenn der entfernte
                <acronym>HTTP</acronym> Server einen <emphasis>404 Not Found</emphasis> zurückgibt,
                wird eine <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen.
            </para>

            <example id="zend.xmlrpc.client.error-handling.http.example-1">
                <title>Verarbeiten von HTTP-Fehlern</title>

                <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://foo/404');

try {

    $client->call('bar', array($arg1, $arg2));

} catch (Zend_XmlRpc_Client_HttpException $e) {

    // $e->getCode() gibt 404 zurück
    // $e->getMessage() gibt "Not Found" zurück

}
]]></programlisting>
            </example>

            <para>
                Ungeachtet des benutzten <acronym>XML-RPC</acronym> Clients wird immer eine
                <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen, wenn
                ein <acronym>HTTP</acronym> Fehler auftritt.
            </para>
        </sect3>

        <sect3 id="zend.xmlrpc.client.error-handling.faults">
            <title>XML-RPC-Fehler</title>

            <para>
                Ein <acronym>XML-RPC</acronym> Fehler wird analog zu einer <acronym>PHP</acronym>
                Exception verwendet. Es ist ein spezieller Typ, der durch einen
                <acronym>XML-RPC</acronym> Methodenaufruf zurückgegeben wurden und einen Fehlercode
                sowie eine Fehlermeldung enthält. <acronym>XML-RPC</acronym> Fehler werden
                unterschiedlich behandelt, was von der Benutzung des
                <classname>Zend_XmlRpc_Client</classname>s abhängt.
            </para>

            <para>
                Wenn die Methode <methodname>call()</methodname> oder der Server-Proxy genutzt
                wird, würde durch einen <acronym>XML-RPC</acronym> Fehler eine
                <classname>Zend_XmlRpc_Client_FaultException</classname> geworfen werden. Der
                Fehlercode und die -meldung der Exception zeigen auf deren zugehörige
                Werte in der originalen <acronym>XML-RPC</acronym> Fehlerantwort.
            </para>

            <example id="zend.xmlrpc.client.error-handling.faults.example-1">
                <title>Verarbeiten von XML-RPC Fehlern</title>

                <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');

try {

    $client->call('badMethod');

} catch (Zend_XmlRpc_Client_FaultException $e) {

    // $e->getCode() gibt 1 zurück
    // $e->getMessage() gibt "Unknown method" zurück

}
]]></programlisting>
            </example>

            <para>
                Wenn die Methode <methodname>call()</methodname> genutzt wird, um eine Anfrage zu
                starten, wird die <classname>Zend_XmlRpc_Client_FaultException</classname> bei einem
                Fehler geworfen. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt, das den
                Fehler enthält, ist allerdings auch verfübar durch die Methode
                <methodname>getLastResponse()</methodname>.
            </para>

            <para>
                Wenn die Methode <methodname>doRequest()</methodname> genutzt wird, um eine
                Anfrage zu starten, wird keine Exception geworfen. Stattdessen
                wird ein <classname>Zend_XmlRpc_Response</classname>-Objekt zurückgegeben,
                das den Fehler enthält. Dieses kann durch den Aufruf der Methode
                <methodname>isFault()</methodname> der Klasse
                <classname>Zend_XmlRpc_Response</classname> überprüft werden.
            </para>
        </sect3>
    </sect2>

    <sect2 id="zend.xmlrpc.client.introspection">
        <title>Server Selbstüberprüfung</title>

        <para>
            Einige <acronym>XML-RPC</acronym> Server bieten de facto Überprüfungsmethoden unter dem
            <acronym>XML-RPC</acronym> Namesraum <emphasis>system.</emphasis>.
            <classname>Zend_XmlRpc_Client</classname> stellt spezielle Verfahren für Server mit
            diesen Möglichkeiten zur Verfügung.
        </para>

        <para>
            Eine Instanz der Klasse <classname>Zend_XmlRpc_Client_ServerIntrospection</classname>
            kann über die Methode <methodname>getIntrospector()</methodname> der Klasse
            <classname>Zend_XmlRpcClient</classname> zurückgegeben werden. Sie kann dann genutzt
            werden, um Überwachungsoperationen auf dem Server auszuführen.
        </para>
    </sect2>

    <sect2 id="zend.xmlrpc.client.request-to-response">
        <title>Von der Anfrage zur Antwort</title>

        <para>
            Intern erstellt die Methode <methodname>call()</methodname> des
            <classname>Zend_XmlRpc_Client</classname>-Objekts ein Anfrage-Objekt
            (<classname>Zend_XmlRpc_Request</classname>) und sendet es zu einer anderen
            Methode, <methodname>doRequest()</methodname>, die ein Antwort-Objekt
            (<classname>Zend_XmlRpc_Response</classname>) zurückgibt.
        </para>

        <para>
            Die Methode <methodname>doRequest()</methodname> kann auch direkt genutzt werden:
        </para>

        <example id="zend.xmlrpc.client.request-to-response.example-1">
            <title>Eine Anfrage zu einer Antwort verarbeiten</title>

            <programlisting language="php"><![CDATA[
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');

$request = new Zend_XmlRpc_Request();
$request->setMethod('test.sayHello');
$request->setParams(array('foo', 'bar'));

$client->doRequest($request);

// $client->getLastRequest() gibt ein Zend_XmlRpc_Request-Objekt zurück
// $client->getLastResponse() gibt ein Zend_XmlRpc_Response-Objekt zurück
]]></programlisting>
        </example>

        <para>
            Immer wenn eine <acronym>XML-RPC</acronym> Methode vom Client aufgerufen wird,
            egal auf welche Weise - entweder über die Methode <methodname>call()</methodname>,
            die Methode <methodname>doRequest()</methodname> oder den Server-Proxy -, ist das
            Objekt der letzten Anfrage, sowie dessen resultierende Antwort-Objekte,
            immer durch die Methoden <methodname>getLastRequest()</methodname> und
            <methodname>getLastResponse()</methodname> verfügbar.
        </para>
    </sect2>

    <sect2 id="zend.xmlrpc.client.http-client">
        <title>HTTP-Client und das Testen</title>

        <para>
            In jedem der vorangegangenen Beispiele wurde kein <acronym>HTTP</acronym> Client
            bestimmt. In diesem Fall wird eine neue Instanz eines
            <classname>Zend_Http_Client</classname>s mit dessen standardmäßigen
            Einstellungen erstellt und automatisch vom <classname>Zend_XmlRpc_Client</classname>
            benutzt.
        </para>

        <para>
            Der <acronym>HTTP</acronym> Client kann zu jeder Zeit mit der Methode
            <methodname>getHttpClient()</methodname> zurückgegeben werden. In den meisten
            Fällen jedoch ist der Standard <acronym>HTTP</acronym> Client ausreichend. Allerdings
            erlaubt die Methode <methodname>setHttpClient()</methodname> das Setzen eines
            anderen <acronym>HTTP</acronym> Clients.
        </para>

        <para>
            Die Methode <methodname>setHttpClient()</methodname> ist besonders nützlich für
            UnitTests. Wenn es mit dem <classname>Zend_Http_Client_Adapter_Test</classname>
            kombiniert wird, können entfernte Services für das Testen nachgeahmt werden.
            In den UnitTests für <classname>Zend_XmlRpc_Client</classname> sind Beispiele,
            wie so was erreicht werden kann.
        </para>
    </sect2>
</sect1>