File: Zend_Json-Server.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 (1035 lines) | stat: -rw-r--r-- 41,921 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
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.json.server">
    <title>Zend_Json_Server - JSON-RPC Server</title>

    <para>
        <classname>Zend_Json_Server</classname> ist eine
        <ulink url="http://groups.google.com/group/json-rpc/">JSON-RPC</ulink> Server
        Implementierung. Sie unterstützt sowohl <ulink
            url="http://json-rpc.org/wiki/specification">die Spezifikation von JSON-RPC Version
            1</ulink> als auch die <ulink
            url="http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal">Spezifikation
            der Version 2</ulink>; zusätzlich bietet Sie eine <acronym>PHP</acronym> Implementierung
        der <ulink
            url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">Spezifikation
            für Service Mapping Description (SMD)</ulink> Um Kunden von Services deren Metadaten
        anzubieten.
    </para>

    <para>
        JSON-RPC ist ein leichgewichtiges Remoce Procedure Call Protokoll das
        <acronym>JSON</acronym> für seine Nachrichten verwendet. Diese JSON-RPC
        Implementierung folgt <acronym>PHP</acronym>'s <ulink
            url="http://www.php.net/manual/en/class.soapserver.php">SoapServer</ulink>
        <acronym>API</acronym>. Das bedeutet das in einer typischen Situation einfach folgendes
        getan wird:
    </para>

    <itemizedlist>
        <listitem><para>Instanzieren des Server Objekts</para></listitem>

        <listitem>
            <para>
                Eine oder mehrere Funktionen und/oder Klassen/Objekte dem Server Objekt hinzufügen
            </para>
        </listitem>

        <listitem><para>Die Anfrage mit handle() ausführen</para></listitem>
    </itemizedlist>

    <para>
        <classname>Zend_Json_Server</classname> verwendet <link
            linkend="zend.server.reflection">Zend_Server_Reflection</link> um Reflektion
        durchzuführen um den SMD zu erstellen und die Signaturen der Methodenaufrufe zu erzwingen.
        Als solche, ist es zwingend notwendig das alle hinzugefügten Funktionen und/oder
        Klassenmethoden komplette <acronym>PHP</acronym> Docblocks dokumentiert haben mindestens
        aber:
    </para>

    <itemizedlist>
        <listitem><para>Alle Parameter und deren erwarteter Variablentypen</para></listitem>
        <listitem><para>Den Variablentyp des Rückgabewertes</para></listitem>
    </itemizedlist>

    <para>
        <classname>Zend_Json_Server</classname> hört aktuell nur auf POST Anfragen; glücklicherweise
        bieten die meisten JSON-RPC Client Implementierungen die zur aktuell
        vorhanden sind nur POST Anfragen. Das macht es einfach den gleichen Endpunkt des Servers so
        zu verwenden das er beide Anfragen behandelt sowie die Service SMD liefert, wie im nächsten
        Beispiel gezeigt.
    </para>

    <example id="zend.json.server.usage">
        <title>Zend_Json_Server Verwendung</title>

        <para>
            Zuerst müssen wir eine Klasse definieren die wir über den JSON-RPC
            Server ausliefern wollen. Wir nennen die Klasse 'Calculator', und definieren die
            Methoden 'add', 'substract', 'multiple', und 'divide':
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Calculator - Einfache Klasse zur Auslieferung über JSON-RPC
 */
class Calculator
{
    /**
     * Summe von zwei Variablen zurückgeben
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function add($x, $y)
    {
        return $x + $y;
    }

    /**
     * Differenz von zwei Variablen zurückgeben
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function subtract($x, $y)
    {
        return $x - $y;
    }

    /**
     * Produkt von zwei Variablen zurückgeben
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function multiply($x, $y)
    {
        return $x * $y;
    }

    /**
     * Division von zwei Variablen zurückgeben
     *
     * @param  int $x
     * @param  int $y
     * @return float
     */
    public function divide($x, $y)
    {
        return $x / $y;
    }
}
]]></programlisting>

        <para>
            Es ist zu beachten das jede Methode einen Docblock mit Einträgen besitzt die jeden
            Parameter und seinen Typ beschreiben, sowie einen Eintrag für den Rückgabewert. Das ist
            <emphasis>absolut kritisch</emphasis> wenn <classname>Zend_Json_Server</classname>
            verwendet wird, oder auch jede andere Server Komponente für diesen Zweck im Zend
            Framework.
        </para>

        <para>
            Erstellen wir also ein Skript um die Anfrage zu behandeln:
        </para>

        <programlisting language="php"><![CDATA[
$server = new Zend_Json_Server();

// Zeigt welche Funktionalität vorhanden ist:
$server->setClass('Calculator');

// Behandelt die Anfrage:
$server->handle();
]]></programlisting>

        <para>
            Trotzdem behandelt das noch immer nicht das Problem der Rückgabe eines SMD damit der
            JSON-RPC Client die Methoden selbstständig erkennen kann. Das kann
            getan werden indem die <acronym>HTTP</acronym> Anfragemethode erkannt wird, und
            anschließend einige Metadaten des Servers spezifiziert werden:
        </para>

        <programlisting language="php"><![CDATA[
$server = new Zend_Json_Server();
$server->setClass('Calculator');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Zeigt den Endpunkt der URL, und die verwendete JSON-RPC Version:
    $server->setTarget('/json-rpc.php')
           ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);

    // Den SMD holen
    $smd = $server->getServiceMap();

    // Den SMD an den Client zurückgeben
    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server->handle();
]]></programlisting>

        <para>
            Wenn der JSON-RPC Server mit dem Dojo Toolkit verwendet wird muß auch
            ein spezielles Kompatibilitätsflag gesetzt werden um sicherzustellen das die zwei
            korrekt miteinander arbeiten:
        </para>

        <programlisting language="php"><![CDATA[
$server = new Zend_Json_Server();
$server->setClass('Calculator');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    $server->setTarget('/json-rpc.php')
           ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
    $smd = $server->getServiceMap();

    // Die Kompatibilität zu Dojo setzen:
    $smd->setDojoCompatible(true);

    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server->handle();
]]></programlisting>
    </example>

    <sect2 id="zend.json.server.details">
        <title>Fortgescrittene Details</title>

        <para>
            Obwohl das meiste an Funktionalität für <classname>Zend_Json_Server</classname> in
            <link linkend="zend.json.server.usage">diesem Abschnitt</link> beschrieben wurde, ist
            noch weitere fortgeschrittenere Funktionalität vorhanden.
        </para>

        <sect3 id="zend.json.server.details.zendjsonserver">
            <title>Zend_Json_Server</title>

            <para>
                <classname>Zend_Json_Server</classname> ist die Kernklasse von
                JSON-RPC; die bearbeitet alle Anfragen und gibt den Antwort
                Payload zurück. Sie hat die folgenden Methoden:
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>addFunction($function)</methodname>: Spezifiziert eine
                        benutzerdefinierte Funktion die dem Server hinzugefügt werden soll.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setClass($class)</methodname>: Spezifiziert eine Klasse oder ein
                        Objekt das dem Server hinzugefügt werden soll; alle öffentlichen Methoden
                        dieses Elemente werden als JSON-RPC Methoden
                        bekanntgegeben.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>fault($fault = null, $code = 404, $data = null)</methodname>:
                        Erstellt und retourniert ein <classname>Zend_Json_Server_Error</classname>
                        Objekt.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>handle($request = false)</methodname>: Behandelt eine
                        JSON-RPC Anfrage; optional kann ein
                        <classname>Zend_Json_Server_Request</classname> Objekt für die Anpassung
                        übergeben werden (standardmäßig wird eines erstellt).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getFunctions()</methodname>: Gibt eine Liste aller hinzugefügten
                        Methoden zurück.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setRequest(Zend_Json_Server_Request $request)</methodname>:
                        Spezifiziert ein Anfrageobjekt um es für den Server zu verwenden.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getRequest()</methodname>: Empfängt das Anfrageobjekt das vom
                        Server verwendet wird.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setResponse(Zend_Json_Server_Response $response)</methodname>:
                        Setzt das Antwort Objekt das der Server verwendet.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getResponse()</methodname>: Empfängt das Anfrageobjekt das vom
                        Server verwendet wird.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setAutoEmitResponse($flag)</methodname>: Zeigt ob der Server die
                        Antworten und alle Header automatisch ausgeben sollte; standardmäßig ist sie
                        <constant>TRUE</constant>.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>autoEmitResponse()</methodname>: Stellt fest ob das automatische
                        senden der Antwort eingeschaltet ist.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getServiceMap()</methodname>: Empfängt die Service Map
                        Description in der Form eines <classname>Zend_Json_Server_Smd</classname>
                        Objekts
                    </para>
                </listitem>
            </itemizedlist>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonserverrequest">
            <title>Zend_Json_Server_Request</title>

            <para>
                Die JSON-RPC Anfrageumgebung ist in ein
                <classname>Zend_Json_Server_Request</classname> Objekt eingekapselt. Diese Objekt
                erlaubt es die notwendigen Teile der JSON-RPC Anfrage zu setzen,
                inklusive der Anfrage ID, Parametern, und der JSON-RPC
                spezifischen Version. Es hat die Möglichkeit sich selbst über
                <acronym>JSON</acronym> zu laden oder ein Set von Optionen, und kann sich selbst
                über die <methodname>toJson()</methodname> Methode als <acronym>JSON</acronym>
                darstellen.
            </para>

            <para>
                Das Anfrage Objekt enthält die folgenden Methoden:
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setOptions(array $options)</methodname>: Spezifiziert die
                        Konfiguration des Objektes. <varname>$options</varname> kann Schlüssel
                        enthalten die jeglicher 'set' Methode entsprechen:
                        <methodname>setParams()</methodname>, <methodname>setMethod()</methodname>,
                        <methodname>setId()</methodname> und <methodname>setVersion()</methodname>.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>addParam($value, $key = null)</methodname>: Fügt einen Parameter
                        hinzu der mit einem Methodenaufruf verwendet wird. Parameter können nur
                        Werte sein, oder optional auch den Parameternamen enthalten.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>addParams(array $params)</methodname>: Mehrere Parameter auf
                        einmal hinzufügen; Ruft <methodname>addParam()</methodname> auf
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setParams(array $params)</methodname>: Setzt alle Parameter auf
                        einmal; überschreibt jeden existierenden Parameter.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getParam($index)</methodname>: Empfängt einen Parameter durch
                        seine Position oder seinen Namen.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getParams()</methodname>: Empfängt alle Parameter auf einmal.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setMethod($name)</methodname>: Setzt die Methode die aufgerufen
                        wird.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getMethod()</methodname>: Empfängt die Methode die aufgerufen
                        wird.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>isMethodError()</methodname>: Erkennt ob eine Anfrage fehlerhaft
                        ist und einen Fehler produzieren würde, oder nicht.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setId($name)</methodname>: Setzt den Identifikator der Anfrage
                        (durch den Client verwendet um Anfragen auf Antworten abzubilden).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getId()</methodname>: Empfängt den Anfrage Identifikator.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setVersion($version)</methodname>: Setzt die Version der
                        JSON-RPC Spezifikation der die Anfrage entspricht. Kann
                        entweder '1.0' oder '2.0' sein.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getVersion()</methodname>: Empfängt die Version der
                        JSON-RPC Spezifikation die von der Anfrage verwendetwird.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>loadJson($json)</methodname>: Lädt das Anfrageobjekt von einem
                        <acronym>JSON</acronym> String.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toJson()</methodname>: Stellt den <acronym>JSON</acronym> String
                        als Anfrage dar.
                    </para>
                </listitem>
            </itemizedlist>

            <para>
                Eine <acronym>HTTP</acronym> spezifische Version ist über
                <classname>Zend_Json_Server_Request_Http</classname> vorhanden. Diese Klasse
                empfängt eine Anfrage über <filename>php://input</filename> und erlaubt den Zugriff
                auf die rohen <acronym>JSON</acronym> Daten über die
                <methodname>getRawJson()</methodname> Methode.
            </para>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonserverresponse">
            <title>Zend_Json_Server_Response</title>

            <para>
                Der JSON-RPC Antwort Payload ist in ein
                <classname>Zend_Json_Server_Response</classname> Objekt gekapselt. Diese Objekt
                erlaubt es den Rückgabewert der Anfrage zu setzen, ob die Antwort ein Fehler ist
                oder nicht, den Anfrageindentifikator, die Version der JSON-RPC
                Spezifikation der die Antwort entspricht, und optional die Servicemap.
            </para>

            <para>
                Das Antwortobjekt bietet die folgenden Methoden:
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setResult($value)</methodname>: Setzt das Ergebnis der Antwort.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getResult()</methodname>: Empfängt das Antwortergebnis.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setError(Zend_Json_Server_Error $error)</methodname>: Setzt ein
                        Fehlerobjekt. Wenn es gesetzt wird, wird es als Antwort verwendet wenn
                        <acronym>JSON</acronym> serialisiert wird.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getError()</methodname>: Empfängt das Fehlerobjekt, wenn
                        vorhanden.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>isError()</methodname>: Ob die Antwort eine Fehlerantwort ist
                        oder nicht.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setId($name)</methodname>: Setzt den Antwortindentifikator
                        (damit der Client die Antwort mit der Originalanfrage in Verbindung bringt).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getId()</methodname>: Empfängt den Antwortidentifikator.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setVersion($version)</methodname>: Setzt die
                        JSON-RPC Version der die Antwort entspricht.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getVersion()</methodname>: Empfängt die
                        JSON-RPC Version der die Antwort entspricht.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toJson()</methodname>: Serialisiert die Antwort auf
                        <acronym>JSON</acronym>. Wenn die Antwort eine Fehlerantwort ist, wird das
                        Fehlerobjekt serialisiert.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setServiceMap($serviceMap)</methodname>: Setzt das Servicemap
                        Objekt für die Antwort.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getServiceMap()</methodname>: Empfängt das Servicemap Objekt,
                        wenn es vorhanden ist.
                    </para>
                </listitem>
            </itemizedlist>

            <para>
                Eine <acronym>HTTP</acronym> spezifische Version ist über
                <classname>Zend_Json_Server_Response_Http</classname> vorhanden. Diese Klasse wird
                entsprechende <acronym>HTTP</acronym> Header senden als auch die Antwort auf
                <acronym>JSON</acronym> zu serialisieren.
            </para>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonservererror">
            <title>Zend_Json_Server_Error</title>

            <para>
                JSON-RPC hat ein spezielles Format für das Melden von
                Fehlerzuständen. Alle Fehler müssen mindestens, eine Fehlermeldung und einen
                Fehlercode anbieten; optional können Sie zusätzliche Daten, wie ein Backtrace,
                anbieten.
            </para>

            <para>
                Fehlercodes sind von jenen abgeleitet die vom
                <ulink url="http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php">vom
                    XML-RPC EPI Projekt</ulink> empfohlen werden.
                <classname>Zend_Json_Server</classname> fügt den richtigen Code basierend auf der
                Fehlerkondition zu. Für Anwendungsausnahmen wird der Code '-32000' verwendet.
            </para>

            <para>
                <classname>Zend_Json_Server_Error</classname> bietet die folgenden Methoden:
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setCode($code)</methodname>: Setzt den Fehlercode: Wenn der Code
                        nicht im akzeptierten Bereich der XML-RPC Fehlercodes
                        ist, wird -32000 hinzugefügt.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getCode()</methodname>: Empfängt den aktuellen Fehlercode.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setMessage($message)</methodname>: Setzt die Fehlernachricht.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getMessage()</methodname>: Empfängt die aktuelle
                        Fehlernachricht.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setData($data)</methodname>: Setzt zusätzliche Daten die den
                        Fehler genauer qualifizieren, wie ein Backtrace.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getData()</methodname>: Empfängt alle aktuellen zusätzlichen
                        Fehlerdaten.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toArray()</methodname>: Weist den Fehler einem Array zu. Das
                        Array enthält die Schlüssel 'code', 'message' und 'data'.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toJson()</methodname>: Weist den Fehler einer
                        JSON-RPC Fehlerrepräsentation zu.
                    </para>
                </listitem>
            </itemizedlist>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonserversmd">
            <title>Zend_Json_Server_Smd</title>

            <para>
                SMD steht für Service Mapping Description, ein <acronym>JSON</acronym> Schema das
                definiert wie ein Client mit einem speziellen Web Service interagieren kann. Zu der
                Zeit wie das geschrieben wurde, wurde die <ulink
                    url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">Spezifikation</ulink>
                noch nicht formell ratifiziert, aber Sie ist bereits im Dojo Toolkit in Verwendung
                sowie in anderen JSON-RPC Kundenclients.
            </para>

            <para>
                Grundsätzlich bezeichnet eine Service Mapping Description die Methode des Transports
                (POST, <constant>GET</constant>, <acronym>TCP</acronym>/IP, usw.), den Envelopetyp
                der Anfrage (normalerweise basierend auf dem Protokoll des Servers), die Ziel
                <acronym>URL</acronym> des Service Providers, und eine Mappe der vorhandenen
                Services. Im Fall von JSON-RPC ist die Service Mappe eine Liste
                von vorhandenen Methoden wobei jede Methode die vorhandenen Parameter und deren
                Typen beschreibt, sowie den erwarteten Typ des Rückgabewerts.
            </para>

            <para>
                <classname>Zend_Json_Server_Smd</classname> bietet einen Objektorientierten Weg um
                Service Mappen zu erstellen. Grundsätzlich werden Ihm Metadaten übergeben die den
                Service beschreiben indem Mutatoren verwendet und Services (Methoden und Funktionen)
                spezifiziert werden.
            </para>

            <para>
                Die Servicebeschreibungen selbst sind typischerweise Instanzen von
                <classname>Zend_Json_Server_Smd_Service</classname>; man kann genauso alle
                Informationen als Array an die verschiedenen Servicemutatoren in
                <classname>Zend_Json_Server_Smd</classname> übergeben, und es wird für einen ein
                Serviceobjekt instanziieren. Die Serviceobjekte enthalten Informationen wie den
                Namen des Services (typischerweise die Funktion oder den Methodennamen), die
                Parameter (Namen, Typen und Position), und den Typ des Rückgabewerts. Optionen kann
                jedes Service sein eigenes Ziel und Envelope haben, obwohl diese Funktionalität
                selten verwendet wird.
            </para>

            <para>
                <classname>Zend_Json_Server</classname> führt all das im Hintergrund durch, indem
                Reflektion auf den hinzugefügten Klassen und Funktionen verwendet wird; man sollte
                seine eigenen Service Maps erstellen wenn man eigene Funktionalitäten anbieten will
                welche die Introspektion von Klassen und Funktionen nicht bieten kann.
            </para>

            <para>
                Die vorhandenen Methoden in <classname>Zend_Json_Server_Smd</classname> enthalten:
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setOptions(array $options)</methodname>: Erstellt ein SMD Objekt
                        von einem Array an Optionen. Alle Mutatoren (Methoden die mit 'set'
                        beginnen) können als Schlüssel verwendet werden.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setTransport($transport)</methodname>: Setzt den Transport der
                        für den Zugriff auf das Service verwendet werden soll; aktuell wird nur POST
                        unterstützt.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getTransport()</methodname>: Empfängt den aktuellen Transport
                        des Services.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setEnvelope($envelopeType)</methodname>: Setzt den aktuelle
                        Anfrageenvelope der verwendet werden sollte um auf den Service zuzugreifen.
                        Aktuell werden die Konstanten
                        <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant> und
                        <constant>Zend_Json_Server_Smd::ENV_JSONRPC_2</constant> verwendet.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getEnvelope()</methodname>: Empfängt den aktuellen
                        Anfrageenvelope.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setContentType($type)</methodname>: Setzt den Contenttype den
                        Anfragen verwenden sollten (standardmäßig ist das 'application/json').
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getContentType()</methodname>: Empfängt den aktuellen
                        Contenttype für Anfragen an den Service.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setTarget($target)</methodname>: Setzt den aktuellen
                        <acronym>URL</acronym> Endpunkt für den Service.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getTarget()</methodname>: Empfängt den <acronym>URL</acronym>
                        Endpunkt für den Service.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setId($id)</methodname>: Tpischerweise ist das der
                        <acronym>URL</acronym> Endpunkt des Services (der selbe wie das Ziel).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getId()</methodname>: Empfängt die ServiceID (typischerweise der
                        <acronym>URL</acronym> Endpunkt des Services).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setDescription($description)</methodname>: Setzt eine
                        Servicebeschreibung (typischerweise nähere Informationen die den Zweck des
                        Services beschreiben).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getDescription()</methodname>: Empfängt die Servicebeschreibung.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setDojoCompatible($flag)</methodname>: Setzt ein Flag das
                        indiziert ob das SMD mit dem Dojo Toolkit kompatibel ist oder nicht. Wenn es
                        <constant>TRUE</constant> ist, dann ist das erzeugte <acronym>JSON</acronym>
                        SMD so formatiert das es dem Format entspricht das Dojo's JSON-RPC Client
                        erwartet.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>isDojoCompatible()</methodname>: Gibt den Wert des
                        Dojokompatibilitätsflags zurück (Standardmäßig <constant>FALSE</constant>).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>addService($service)</methodname>: Fügt ein Service der Mappe
                        hinzu. Kann ein Array von Informationen sein die an den Konstruktor von
                        <classname>Zend_Json_Server_Smd_Service</classname> übergeben werden, oder
                        eine Instanz dieser Klasse.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>addServices(array $services)</methodname>: Fügt mehrere Services
                        auf einmal hinzu.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setServices(array $services)</methodname>: Fügt mehrere Serices
                        auf einmal hinzu, und überschreibt alle vorher gesetzten Services.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getService($name)</methodname>: Gibt ein Service durch seinen
                        Namen zurück.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getServices()</methodname>: Gibt alle hinzugefügten Services
                        zurück.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>removeService($name)</methodname>: Entfernt ein Service von der
                        Mappe.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toArray()</methodname>: Weißt die Service Mappe einem Array zu.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toDojoArray()</methodname>: Weißt die Service Mappe einem Array
                        zu das mit dem Dojo Toolkit kompatibel ist.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toJson()</methodname>: Weißt die Service Mappe einer
                        <acronym>JSON</acronym> Repräsentation zu.
                    </para>
                </listitem>
            </itemizedlist>

            <para>
                <classname>Zend_Json_Server_Smd_Service</classname> hat die folgenden Methoden:
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setOptions(array $options)</methodname>: Setzt den Objektstatus
                        durch ein Array. Jeder Mutator (Methoden die mit 'set' beginnen, kann als
                        Schlüssel verwendet und über diese Methode gesetzt werden.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setName($name)</methodname>: Setzt den Namen des Services
                        (typischerweise die Funktion oder den Methodennamen).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getName()</methodname>: Empfängt den Servicenamen.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setTransport($transport)</methodname>: Setzt den Transport des
                        Services (aktuell werden nur Transporte unterstützt die in
                        <classname>Zend_Json_Server_Smd</classname> erlaubt sind).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getTransport()</methodname>: Empfängt den aktuellen Transport.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setTarget($target)</methodname>: Setzt den
                        <acronym>URL</acronym> Endpunkt des Services (typischerweise ist das der
                        selbe wir im gesamten SMD welchem der Service hinzugefügt wird).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getTarget()</methodname>: Gibt den <acronym>URL</acronym>
                        Endpunkt des Services zurück.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setEnvelope($envelopeType)</methodname>: Setzt den
                        Serviceenvelope (aktuell werden nur Envelopes unterstützt die in
                        <classname>Zend_Json_Server_Smd</classname> erlaubt sind).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getEnvelope()</methodname>: Empfängt den Typ des
                        Serviceenvelopes.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>addParam($type, array $options = array(), $order =
                            null)</methodname>: Fügt dem Service einen Parameter hinzu.
                        Standardmäßig ist nur der Parametertyp notwendig. Trotzdem kann die
                        Reihenfolge spezifiziert werden sowie auch Optionen wie:
                    </para>

                    <itemizedlist>
                        <listitem>
                            <para>
                                <emphasis>name</emphasis>: Der Name des Parameters
                            </para>
                        </listitem>

                        <listitem>
                            <para>
                                <emphasis>optional</emphasis>: Ob der Parameter optional ist oder
                                nicht
                            </para>
                        </listitem>

                        <listitem>
                            <para>
                                <emphasis>default</emphasis>: Ein Standardwert für diesen Parameter
                            </para>
                        </listitem>

                        <listitem>
                            <para>
                                <emphasis>description</emphasis>: Ein Text der den Parameter
                                beschreibt
                            </para>
                        </listitem>
                    </itemizedlist>
                </listitem>

                <listitem>
                    <para>
                        <methodname>addParams(array $params)</methodname>: Fügt verschiedene
                        Parameter auf einmal hinzu; jeder Parameter sollte ein Assoziatives Array
                        sein das mindestens den Schlüssel 'type' enthält welches den Typ des
                        Parameters beschreibt, und optinal den Schlüssel 'order'; jeden andere
                        Schlüssel wird als <varname>$options</varname> an
                        <methodname>addOption()</methodname> übergeben.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setParams(array $params)</methodname>: Setzt viele Parameter aus
                        einmal, überschreibt alle aktuellen Parameter auf einmal.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getParams()</methodname>: Empfängt alle aktuell gesetzten
                        Parameter.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>setReturn($type)</methodname>: Setzt den Type des Rückgabewertes
                        des Services.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>getReturn()</methodname>: Empfängt den Typ des Rückgabewertes
                        des Services.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toArray()</methodname>: Weist das Service an ein Array zu.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <methodname>toJson()</methodname>: Weist das Service einer
                        <acronym>JSON</acronym> Repräsentation zu.
                    </para>
                </listitem>
            </itemizedlist>
        </sect3>
    </sect2>
</sect1>