Zend_Json-Server.xml 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 18716 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.json.server">
  5. <title>Zend_Json_Server - JSON-RPC Server</title>
  6. <para>
  7. <classname>Zend_Json_Server</classname> ist eine
  8. <ulink url="http://groups.google.com/group/json-rpc/">JSON-RPC</ulink> Server
  9. Implementierung. Sie unterstützt sowohl <ulink
  10. url="http://json-rpc.org/wiki/specification">die Spezifikation von JSON-RPC Version
  11. 1</ulink> als auch die <ulink
  12. url="http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal">Spezifikation
  13. der Version 2</ulink>; zusätzlich bietet Sie eine <acronym>PHP</acronym> Implementierung
  14. der <ulink
  15. url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">Spezifikation
  16. für Service Mapping Description (SMD)</ulink> Um Kunden von Services deren Metadaten
  17. anzubieten.
  18. </para>
  19. <para>
  20. JSON-RPC ist ein leichgewichtiges Remoce Procedure Call Protokoll das
  21. <acronym>JSON</acronym> für seine Nachrichten verwendet. Diese JSON-RPC
  22. Implementierung folgt <acronym>PHP</acronym>'s <ulink
  23. url="http://www.php.net/manual/en/class.soapserver.php">SoapServer</ulink>
  24. <acronym>API</acronym>. Das bedeutet das in einer typischen Situation einfach folgendes
  25. getan wird:
  26. </para>
  27. <itemizedlist>
  28. <listitem>
  29. <para>
  30. Instanzieren des Server Objekts
  31. </para>
  32. </listitem>
  33. <listitem>
  34. <para>
  35. Eine oder mehrere Funktionen und/oder Klassen/Objekte dem Server Objekt hinzufügen
  36. </para>
  37. </listitem>
  38. <listitem>
  39. <para>
  40. Die Anfrage mit handle() ausführen
  41. </para>
  42. </listitem>
  43. </itemizedlist>
  44. <para>
  45. <classname>Zend_Json_Server</classname> verwendet <xref linkend="zend.server.reflection" />
  46. um Reflektion durchzuführen um den SMD zu erstellen und die Signaturen der Methodenaufrufe
  47. zu erzwingen. Als solche, ist es zwingend notwendig das alle hinzugefügten Funktionen
  48. und/oder Klassenmethoden komplette <acronym>PHP</acronym> Docblocks dokumentiert haben
  49. mindestens aber:
  50. </para>
  51. <itemizedlist>
  52. <listitem>
  53. <para>
  54. Alle Parameter und deren erwarteter Variablentypen
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. Den Variablentyp des Rückgabewertes
  60. </para>
  61. </listitem>
  62. </itemizedlist>
  63. <para>
  64. <classname>Zend_Json_Server</classname> hört aktuell nur auf POST Anfragen; glücklicherweise
  65. bieten die meisten JSON-RPC Client Implementierungen die zur aktuell
  66. vorhanden sind nur POST Anfragen. Das macht es einfach den gleichen Endpunkt des Servers so
  67. zu verwenden das er beide Anfragen behandelt sowie die Service SMD liefert, wie im nächsten
  68. Beispiel gezeigt.
  69. </para>
  70. <example id="zend.json.server.usage">
  71. <title>Zend_Json_Server Verwendung</title>
  72. <para>
  73. Zuerst müssen wir eine Klasse definieren die wir über den JSON-RPC
  74. Server ausliefern wollen. Wir nennen die Klasse 'Calculator', und definieren die
  75. Methoden 'add', 'substract', 'multiple', und 'divide':
  76. </para>
  77. <programlisting language="php"><![CDATA[
  78. /**
  79. * Calculator - Einfache Klasse zur Auslieferung über JSON-RPC
  80. */
  81. class Calculator
  82. {
  83. /**
  84. * Summe von zwei Variablen zurückgeben
  85. *
  86. * @param int $x
  87. * @param int $y
  88. * @return int
  89. */
  90. public function add($x, $y)
  91. {
  92. return $x + $y;
  93. }
  94. /**
  95. * Differenz von zwei Variablen zurückgeben
  96. *
  97. * @param int $x
  98. * @param int $y
  99. * @return int
  100. */
  101. public function subtract($x, $y)
  102. {
  103. return $x - $y;
  104. }
  105. /**
  106. * Produkt von zwei Variablen zurückgeben
  107. *
  108. * @param int $x
  109. * @param int $y
  110. * @return int
  111. */
  112. public function multiply($x, $y)
  113. {
  114. return $x * $y;
  115. }
  116. /**
  117. * Division von zwei Variablen zurückgeben
  118. *
  119. * @param int $x
  120. * @param int $y
  121. * @return float
  122. */
  123. public function divide($x, $y)
  124. {
  125. return $x / $y;
  126. }
  127. }
  128. ]]></programlisting>
  129. <para>
  130. Es ist zu beachten das jede Methode einen Docblock mit Einträgen besitzt die jeden
  131. Parameter und seinen Typ beschreiben, sowie einen Eintrag für den Rückgabewert. Das ist
  132. <emphasis>absolut kritisch</emphasis> wenn <classname>Zend_Json_Server</classname>
  133. verwendet wird -- oder auch jede andere Server Komponente für diesen Zweck im Zend
  134. Framework.
  135. </para>
  136. <para>
  137. Erstellen wir also ein Skript um die Anfrage zu behandeln:
  138. </para>
  139. <programlisting language="php"><![CDATA[
  140. $server = new Zend_Json_Server();
  141. // Zeigt welche Funktionalität vorhanden ist:
  142. $server->setClass('Calculator');
  143. // Behandelt die Anfrage:
  144. $server->handle();
  145. ]]></programlisting>
  146. <para>
  147. Trotzdem behandelt das noch immer nicht das Problem der Rückgabe eines SMD damit der
  148. JSON-RPC Client die Methoden selbstständig erkennen kann. Das kann
  149. getan werden indem die <acronym>HTTP</acronym> Anfragemethode erkannt wird, und
  150. anschließend einige Metadaten des Servers spezifiziert werden:
  151. </para>
  152. <programlisting language="php"><![CDATA[
  153. $server = new Zend_Json_Server();
  154. $server->setClass('Calculator');
  155. if ('GET' == $_SERVER['REQUEST_METHOD']) {
  156. // Zeigt den Endpunkt der URL, und die verwendete JSON-RPC Version:
  157. $server->setTarget('/json-rpc.php')
  158. ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
  159. // Den SMD holen
  160. $smd = $server->getServiceMap();
  161. // Den SMD an den Client zurückgeben
  162. header('Content-Type: application/json');
  163. echo $smd;
  164. return;
  165. }
  166. $server->handle();
  167. ]]></programlisting>
  168. <para>
  169. Wenn der JSON-RPC Server mit dem Dojo Toolkit verwendet wird muß auch
  170. ein spezielles Kompatibilitätsflag gesetzt werden um sicherzustellen das die zwei
  171. korrekt miteinander arbeiten:
  172. </para>
  173. <programlisting language="php"><![CDATA[
  174. $server = new Zend_Json_Server();
  175. $server->setClass('Calculator');
  176. if ('GET' == $_SERVER['REQUEST_METHOD']) {
  177. $server->setTarget('/json-rpc.php')
  178. ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
  179. $smd = $server->getServiceMap();
  180. // Die Kompatibilität zu Dojo setzen:
  181. $smd->setDojoCompatible(true);
  182. header('Content-Type: application/json');
  183. echo $smd;
  184. return;
  185. }
  186. $server->handle();
  187. ]]></programlisting>
  188. </example>
  189. <sect2 id="zend.json.server.details">
  190. <title>Fortgescrittene Details</title>
  191. <para>
  192. Obwohl das meiste an Funktionalität für <classname>Zend_Json_Server</classname> in
  193. <xref linkend="zend.json.server.usage" /> beschrieben wurde, ist noch weitere
  194. fortgeschrittenere Funktionalität vorhanden.
  195. </para>
  196. <sect3 id="zend.json.server.details.zendjsonserver">
  197. <title>Zend_Json_Server</title>
  198. <para>
  199. <classname>Zend_Json_Server</classname> ist die Kernklasse von
  200. JSON-RPC; die bearbeitet alle Anfragen und gibt den Antwort
  201. Payload zurück. Sie hat die folgenden Methoden:
  202. </para>
  203. <itemizedlist>
  204. <listitem>
  205. <para>
  206. <methodname>addFunction($function)</methodname>: Spezifiziert eine
  207. benutzerdefinierte Funktion die dem Server hinzugefügt werden soll.
  208. </para>
  209. </listitem>
  210. <listitem>
  211. <para>
  212. <methodname>setClass($class)</methodname>: Spezifiziert eine Klasse oder ein
  213. Objekt das dem Server hinzugefügt werden soll; alle öffentlichen Methoden
  214. dieses Elemente werden als JSON-RPC Methoden
  215. bekanntgegeben.
  216. </para>
  217. </listitem>
  218. <listitem>
  219. <para>
  220. <methodname>fault($fault = null, $code = 404, $data = null)</methodname>:
  221. Erstellt und retourniert ein <classname>Zend_Json_Server_Error</classname>
  222. Objekt.
  223. </para>
  224. </listitem>
  225. <listitem>
  226. <para>
  227. <methodname>handle($request = false)</methodname>: Behandelt eine
  228. JSON-RPC Anfrage; optional kann ein
  229. <classname>Zend_Json_Server_Request</classname> Objekt für die Anpassung
  230. übergeben werden (standardmäßig wird eines erstellt).
  231. </para>
  232. </listitem>
  233. <listitem>
  234. <para>
  235. <methodname>getFunctions()</methodname>: Gibt eine Liste aller hinzugefügten
  236. Methoden zurück.
  237. </para>
  238. </listitem>
  239. <listitem>
  240. <para>
  241. <methodname>setRequest(Zend_Json_Server_Request $request)</methodname>:
  242. Spezifiziert ein Anfrageobjekt um es für den Server zu verwenden.
  243. </para>
  244. </listitem>
  245. <listitem>
  246. <para>
  247. <methodname>getRequest()</methodname>: Empfängt das Anfrageobjekt das vom
  248. Server verwendet wird.
  249. </para>
  250. </listitem>
  251. <listitem>
  252. <para>
  253. <methodname>setResponse(Zend_Json_Server_Response $response)</methodname>:
  254. Setzt das Antwort Objekt das der Server verwendet.
  255. </para>
  256. </listitem>
  257. <listitem>
  258. <para>
  259. <methodname>getResponse()</methodname>: Empfängt das Anfrageobjekt das vom
  260. Server verwendet wird.
  261. </para>
  262. </listitem>
  263. <listitem>
  264. <para>
  265. <methodname>setAutoEmitResponse($flag)</methodname>: Zeigt ob der Server die
  266. Antworten und alle Header automatisch ausgeben sollte; standardmäßig ist das
  267. aktiviert.
  268. </para>
  269. </listitem>
  270. <listitem>
  271. <para>
  272. <methodname>autoEmitResponse()</methodname>: Stellt fest ob das automatische
  273. senden der Antwort eingeschaltet ist.
  274. </para>
  275. </listitem>
  276. <listitem>
  277. <para>
  278. <methodname>getServiceMap()</methodname>: Empfängt die Service Map
  279. Description in der Form eines <classname>Zend_Json_Server_Smd</classname>
  280. Objekts
  281. </para>
  282. </listitem>
  283. </itemizedlist>
  284. </sect3>
  285. <sect3 id="zend.json.server.details.zendjsonserverrequest">
  286. <title>Zend_Json_Server_Request</title>
  287. <para>
  288. Die JSON-RPC Anfrageumgebung ist in ein
  289. <classname>Zend_Json_Server_Request</classname> Objekt eingekapselt. Diese Objekt
  290. erlaubt es die notwendigen Teile der JSON-RPC Anfrage zu setzen,
  291. inklusive der Anfrage ID, Parametern, und der JSON-RPC
  292. spezifischen Version. Es hat die Möglichkeit sich selbst über
  293. <acronym>JSON</acronym> zu laden oder ein Set von Optionen, und kann sich selbst
  294. über die <methodname>toJson()</methodname> Methode als <acronym>JSON</acronym>
  295. darstellen.
  296. </para>
  297. <para>
  298. Das Anfrage Objekt enthält die folgenden Methoden:
  299. </para>
  300. <itemizedlist>
  301. <listitem>
  302. <para>
  303. <methodname>setOptions(array $options)</methodname>: Spezifiziert die
  304. Konfiguration des Objektes. <varname>$options</varname> kann Schlüssel
  305. enthalten die jeglicher 'set' Methode entsprechen:
  306. <methodname>setParams()</methodname>, <methodname>setMethod()</methodname>,
  307. <methodname>setId()</methodname> und <methodname>setVersion()</methodname>.
  308. </para>
  309. </listitem>
  310. <listitem>
  311. <para>
  312. <methodname>addParam($value, $key = null)</methodname>: Fügt einen Parameter
  313. hinzu der mit einem Methodenaufruf verwendet wird. Parameter können nur
  314. Werte sein, oder optional auch den Parameternamen enthalten.
  315. </para>
  316. </listitem>
  317. <listitem>
  318. <para>
  319. <methodname>addParams(array $params)</methodname>: Mehrere Parameter auf
  320. einmal hinzufügen; Ruft <methodname>addParam()</methodname> auf
  321. </para>
  322. </listitem>
  323. <listitem>
  324. <para>
  325. <methodname>setParams(array $params)</methodname>: Setzt alle Parameter auf
  326. einmal; überschreibt jeden existierenden Parameter.
  327. </para>
  328. </listitem>
  329. <listitem>
  330. <para>
  331. <methodname>getParam($index)</methodname>: Empfängt einen Parameter durch
  332. seine Position oder seinen Namen.
  333. </para>
  334. </listitem>
  335. <listitem>
  336. <para>
  337. <methodname>getParams()</methodname>: Empfängt alle Parameter auf einmal.
  338. </para>
  339. </listitem>
  340. <listitem>
  341. <para>
  342. <methodname>setMethod($name)</methodname>: Setzt die Methode die aufgerufen
  343. wird.
  344. </para>
  345. </listitem>
  346. <listitem>
  347. <para>
  348. <methodname>getMethod()</methodname>: Empfängt die Methode die aufgerufen
  349. wird.
  350. </para>
  351. </listitem>
  352. <listitem>
  353. <para>
  354. <methodname>isMethodError()</methodname>: Erkennt ob eine Anfrage fehlerhaft
  355. ist und einen Fehler produzieren würde, oder nicht.
  356. </para>
  357. </listitem>
  358. <listitem>
  359. <para>
  360. <methodname>setId($name)</methodname>: Setzt den Identifikator der Anfrage
  361. (durch den Client verwendet um Anfragen auf Antworten abzubilden).
  362. </para>
  363. </listitem>
  364. <listitem>
  365. <para>
  366. <methodname>getId()</methodname>: Empfängt den Anfrage Identifikator.
  367. </para>
  368. </listitem>
  369. <listitem>
  370. <para>
  371. <methodname>setVersion($version)</methodname>: Setzt die Version der
  372. JSON-RPC Spezifikation der die Anfrage entspricht. Kann
  373. entweder '1.0' oder '2.0' sein.
  374. </para>
  375. </listitem>
  376. <listitem>
  377. <para>
  378. <methodname>getVersion()</methodname>: Empfängt die Version der
  379. JSON-RPC Spezifikation die von der Anfrage verwendet
  380. wird.
  381. </para>
  382. </listitem>
  383. <listitem>
  384. <para>
  385. <methodname>loadJson($json)</methodname>: Lädt das Anfrageobjekt von einem
  386. <acronym>JSON</acronym> String.
  387. </para>
  388. </listitem>
  389. <listitem>
  390. <para>
  391. <methodname>toJson()</methodname>: Stellt den <acronym>JSON</acronym> String
  392. als Anfrage dar.
  393. </para>
  394. </listitem>
  395. </itemizedlist>
  396. <para>
  397. Eine <acronym>HTTP</acronym> spezifische Version ist über
  398. <classname>Zend_Json_Server_Request_Http</classname> vorhanden. Diese Klasse
  399. empfängt eine Anfrage über <code>php://input</code> und erlaubt den Zugriff auf die
  400. rohen <acronym>JSON</acronym> Daten über die <methodname>getRawJson()</methodname>
  401. Methode.
  402. </para>
  403. </sect3>
  404. <sect3 id="zend.json.server.details.zendjsonserverresponse">
  405. <title>Zend_Json_Server_Response</title>
  406. <para>
  407. Der JSON-RPC Antwort Payload ist in ein
  408. <classname>Zend_Json_Server_Response</classname> Objekt gekapselt. Diese Objekt
  409. erlaubt es den Rückgabewert der Anfrage zu setzen, ob die Antwort ein Fehler ist
  410. oder nicht, den Anfrageindentifikator, die Version der JSON-RPC
  411. Spezifikation der die Antwort entspricht, und optional die Servicemap.
  412. </para>
  413. <para>
  414. Das Antwortobjekt bietet die folgenden Methoden:
  415. </para>
  416. <itemizedlist>
  417. <listitem>
  418. <para>
  419. <methodname>setResult($value)</methodname>: Setzt das Ergebnis der Antwort.
  420. </para>
  421. </listitem>
  422. <listitem>
  423. <para>
  424. <methodname>getResult()</methodname>: Empfängt das Antwortergebnis.
  425. </para>
  426. </listitem>
  427. <listitem>
  428. <para>
  429. <methodname>setError(Zend_Json_Server_Error $error)</methodname>: Setzt ein
  430. Fehlerobjekt. Wenn es gesetzt wird, wird es als Antwort verwendet wenn
  431. <acronym>JSON</acronym> serialisiert wird.
  432. </para>
  433. </listitem>
  434. <listitem>
  435. <para>
  436. <methodname>getError()</methodname>: Empfängt das Fehlerobjekt, wenn
  437. vorhanden.
  438. </para>
  439. </listitem>
  440. <listitem>
  441. <para>
  442. <methodname>isError()</methodname>: Ob die Antwort eine Fehlerantwort ist
  443. oder nicht.
  444. </para>
  445. </listitem>
  446. <listitem>
  447. <para>
  448. <methodname>setId($name)</methodname>: Setzt den Antwortindentifikator
  449. (damit der Client die Antwort mit der Originalanfrage in Verbindung bringt).
  450. </para>
  451. </listitem>
  452. <listitem>
  453. <para>
  454. <methodname>getId()</methodname>: Empfängt den Antwortidentifikator.
  455. </para>
  456. </listitem>
  457. <listitem>
  458. <para>
  459. <methodname>setVersion($version)</methodname>: Setzt die
  460. JSON-RPC Version der die Antwort entspricht.
  461. </para>
  462. </listitem>
  463. <listitem>
  464. <para>
  465. <methodname>getVersion()</methodname>: Empfängt die
  466. JSON-RPC Version der die Antwort entspricht.
  467. </para>
  468. </listitem>
  469. <listitem>
  470. <para>
  471. <methodname>toJson()</methodname>: Serialisiert die Antwort auf
  472. <acronym>JSON</acronym>. Wenn die Antwort eine Fehlerantwort ist, wird das
  473. Fehlerobjekt serialisiert.
  474. </para>
  475. </listitem>
  476. <listitem>
  477. <para>
  478. <methodname>setServiceMap($serviceMap)</methodname>: Setzt das Servicemap
  479. Objekt für die Antwort.
  480. </para>
  481. </listitem>
  482. <listitem>
  483. <para>
  484. <methodname>getServiceMap()</methodname>: Empfängt das Servicemap Objekt,
  485. wenn es vorhanden ist.
  486. </para>
  487. </listitem>
  488. </itemizedlist>
  489. <para>
  490. Eine <acronym>HTTP</acronym> spezifische Version ist über
  491. <classname>Zend_Json_Server_Response_Http</classname> vorhanden. Diese Klasse wird
  492. entsprechende <acronym>HTTP</acronym> Header senden als auch die Antwort auf
  493. <acronym>JSON</acronym> zu serialisieren.
  494. </para>
  495. </sect3>
  496. <sect3 id="zend.json.server.details.zendjsonservererror">
  497. <title>Zend_Json_Server_Error</title>
  498. <para>
  499. JSON-RPC hat ein spezielles Format für das Melden von
  500. Fehlerzuständen. Alle Fehler müssen mindestens, eine Fehlermeldung und einen
  501. Fehlercode anbieten; optional können Sie zusätzliche Daten, wie ein Backtrace,
  502. anbieten.
  503. </para>
  504. <para>
  505. Fehlercodes sind von jenen abgeleitet die vom
  506. <ulink url="http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php">vom
  507. XML-RPC EPI Projekt</ulink> empfohlen werden.
  508. <classname>Zend_Json_Server</classname> fügt den richtigen Code basierend auf der
  509. Fehlerkondition zu. Für Anwendungsausnahmen wird der Code '-32000' verwendet.
  510. </para>
  511. <para>
  512. <classname>Zend_Json_Server_Error</classname> bietet die folgenden Methoden:
  513. </para>
  514. <itemizedlist>
  515. <listitem>
  516. <para>
  517. <methodname>setCode($code)</methodname>: Setzt den Fehlercode: Wenn der Code
  518. nicht im akzeptierten Bereich der XML-RPC Fehlercodes
  519. ist, wird -32000 hinzugefügt.
  520. </para>
  521. </listitem>
  522. <listitem>
  523. <para>
  524. <methodname>getCode()</methodname>: Empfängt den aktuellen Fehlercode.
  525. </para>
  526. </listitem>
  527. <listitem>
  528. <para>
  529. <methodname>setMessage($message)</methodname>: Setzt die Fehlernachricht.
  530. </para>
  531. </listitem>
  532. <listitem>
  533. <para>
  534. <methodname>getMessage()</methodname>: Empfängt die aktuelle
  535. Fehlernachricht.
  536. </para>
  537. </listitem>
  538. <listitem>
  539. <para>
  540. <methodname>setData($data)</methodname>: Setzt zusätzliche Daten die den
  541. Fehler genauer qualifizieren, wie ein Backtrace.
  542. </para>
  543. </listitem>
  544. <listitem>
  545. <para>
  546. <methodname>getData()</methodname>: Empfängt alle aktuellen zusätzlichen
  547. Fehlerdaten.
  548. </para>
  549. </listitem>
  550. <listitem>
  551. <para>
  552. <methodname>toArray()</methodname>: Weist den Fehler einem Array zu. Das
  553. Array enthält die Schlüssel 'code', 'message' und 'data'.
  554. </para>
  555. </listitem>
  556. <listitem>
  557. <para>
  558. <methodname>toJson()</methodname>: Weist den Fehler einer
  559. JSON-RPC Fehlerrepräsentation zu.
  560. </para>
  561. </listitem>
  562. </itemizedlist>
  563. </sect3>
  564. <sect3 id="zend.json.server.details.zendjsonserversmd">
  565. <title>Zend_Json_Server_Smd</title>
  566. <para>
  567. SMD steht für Service Mapping Description, ein <acronym>JSON</acronym> Schema das
  568. definiert wie ein Client mit einem speziellen Web Service interagieren kann. Zu der
  569. Zeit wie das geschrieben wurde, wurde die <ulink
  570. url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">Spezifikation</ulink>
  571. noch nicht formell ratifiziert, aber Sie ist bereits im Dojo Toolkit in Verwendung
  572. sowie in anderen JSON-RPC Kundenclients.
  573. </para>
  574. <para>
  575. Grundsätzlich bezeichnet eine Service Mapping Description die Methode des Transports
  576. (POST, GET, <acronym>TCP</acronym>/IP, usw.), den Envelopetyp der Anfrage
  577. (normalerweise basierend auf dem Protokoll des Servers), die Ziel
  578. <acronym>URL</acronym> des Service Providers, und eine Mappe der vorhandenen
  579. Services. Im Fall von JSON-RPC ist die Service Mappe eine Liste
  580. von vorhandenen Methoden wobei jede Methode die vorhandenen Parameter und deren
  581. Typen beschreibt, sowie den erwarteten Typ des Rückgabewerts.
  582. </para>
  583. <para>
  584. <classname>Zend_Json_Server_Smd</classname> bietet einen Objektorientierten Weg um
  585. Service Mappen zu erstellen. Grundsätzlich werden Ihm Metadaten übergeben die den
  586. Service beschreiben indem Mutatoren verwendet und Services (Methoden und Funktionen)
  587. spezifiziert werden.
  588. </para>
  589. <para>
  590. Die Servicebeschreibungen selbst sind typischerweise Instanzen von
  591. <classname>Zend_Json_Server_Smd_Service</classname>; man kann genauso alle
  592. Informationen als Array an die verschiedenen Servicemutatoren in
  593. <classname>Zend_Json_Server_Smd</classname> übergeben, und es wird für einen ein
  594. Serviceobjekt instanziieren. Die Serviceobjekte enthalten Informationen wie den
  595. Namen des Services (typischerweise die Funktion oder den Methodennamen), die
  596. Parameter (Namen, Typen und Position), und den Typ des Rückgabewerts. Optionen kann
  597. jedes Service sein eigenes Ziel und Envelope haben, obwohl diese Funktionalität
  598. selten verwendet wird.
  599. </para>
  600. <para>
  601. <classname>Zend_Json_Server</classname> führt all das im Hintergrund durch, indem
  602. Reflektion auf den hinzugefügten Klassen und Funktionen verwendet wird; man sollte
  603. seine eigenen Service Maps erstellen wenn man eigene Funktionalitäten anbieten will
  604. die die Introspektion von Klassen und Funktionen nicht bieten kann.
  605. </para>
  606. <para>
  607. Die vorhandenen Methoden in <classname>Zend_Json_Server_Smd</classname> enthalten:
  608. </para>
  609. <itemizedlist>
  610. <listitem>
  611. <para>
  612. <methodname>setOptions(array $options)</methodname>: Erstellt ein SMD Objekt
  613. von einem Array an Optionen. Alle Mutatoren (Methoden die mit 'set'
  614. beginnen) können als Schlüssel verwendet werden.
  615. </para>
  616. </listitem>
  617. <listitem>
  618. <para>
  619. <methodname>setTransport($transport)</methodname>: Setzt den Transport der
  620. für den Zugriff auf das Service verwendet werden soll; aktuell wird nur POST
  621. unterstützt.
  622. </para>
  623. </listitem>
  624. <listitem>
  625. <para>
  626. <methodname>getTransport()</methodname>: Empfängt den aktuellen Transport
  627. des Services.
  628. </para>
  629. </listitem>
  630. <listitem>
  631. <para>
  632. <methodname>setEnvelope($envelopeType)</methodname>: Setzt den aktuelle
  633. Anfrageenvelope der verwendet werden sollte um auf den Service zuzugreifen.
  634. Aktuell werden die Konstanten
  635. <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant> und
  636. <constant>Zend_Json_Server_Smd::ENV_JSONRPC_2</constant> verwendet.
  637. </para>
  638. </listitem>
  639. <listitem>
  640. <para>
  641. <methodname>getEnvelope()</methodname>: Empfängt den aktuellen
  642. Anfrageenvelope.
  643. </para>
  644. </listitem>
  645. <listitem>
  646. <para>
  647. <methodname>setContentType($type)</methodname>: Setzt den Contenttype den
  648. Anfragen verwenden sollten (standardmäßig ist das 'application/json').
  649. </para>
  650. </listitem>
  651. <listitem>
  652. <para>
  653. <methodname>getContentType()</methodname>: Empfängt den aktuellen
  654. Contenttype für Anfragen an den Service.
  655. </para>
  656. </listitem>
  657. <listitem>
  658. <para>
  659. <methodname>setTarget($target)</methodname>: Setzt den aktuellen
  660. <acronym>URL</acronym> Endpunkt für den Service.
  661. </para>
  662. </listitem>
  663. <listitem>
  664. <para>
  665. <methodname>getTarget()</methodname>: Empfängt den <acronym>URL</acronym>
  666. Endpunkt für den Service.
  667. </para>
  668. </listitem>
  669. <listitem>
  670. <para>
  671. <methodname>setId($id)</methodname>: Tpischerweise ist das der
  672. <acronym>URL</acronym> Endpunkt des Services (der selbe wie das Ziel).
  673. </para>
  674. </listitem>
  675. <listitem>
  676. <para>
  677. <methodname>getId()</methodname>: Empfängt die ServiceID (typischerweise der
  678. <acronym>URL</acronym> Endpunkt des Services).
  679. </para>
  680. </listitem>
  681. <listitem>
  682. <para>
  683. <methodname>setDescription($description)</methodname>: Setzt eine
  684. Servicebeschreibung (typischerweise nähere Informationen die den Zweck des
  685. Services beschreiben).
  686. </para>
  687. </listitem>
  688. <listitem>
  689. <para>
  690. <methodname>getDescription()</methodname>: Empfängt die Servicebeschreibung.
  691. </para>
  692. </listitem>
  693. <listitem>
  694. <para>
  695. <methodname>setDojoCompatible($flag)</methodname>: Setzt ein Flag das
  696. indiziert ob das SMD mit dem Dojo Toolkit kompatibel ist oder nicht. Wenn es
  697. true ist, dann ist das erzeugte <acronym>JSON</acronym> SMD so formatiert
  698. das es dem Format entspricht das Dojo's JSON-RPC Client
  699. erwartet.
  700. </para>
  701. </listitem>
  702. <listitem>
  703. <para>
  704. <methodname>isDojoCompatible()</methodname>: Gibt den Wert des
  705. Dojokompatibilitätsflags zurück (Standardmäßig false).
  706. </para>
  707. </listitem>
  708. <listitem>
  709. <para>
  710. <methodname>addService($service)</methodname>: Fügt ein Service der Mappe
  711. hinzu. Kann ein Array von Informationen sein die an den Konstruktor von
  712. <classname>Zend_Json_Server_Smd_Service</classname> übergeben werden, oder
  713. eine Instanz dieser Klasse.
  714. </para>
  715. </listitem>
  716. <listitem>
  717. <para>
  718. <methodname>addServices(array $services)</methodname>: Fügt mehrere Services
  719. auf einmal hinzu.
  720. </para>
  721. </listitem>
  722. <listitem>
  723. <para>
  724. <methodname>setServices(array $services)</methodname>: Fügt mehrere Serices
  725. auf einmal hinzu, und überschreibt alle vorher gesetzten Services.
  726. </para>
  727. </listitem>
  728. <listitem>
  729. <para>
  730. <methodname>getService($name)</methodname>: Gibt ein Service durch seinen
  731. Namen zurück.
  732. </para>
  733. </listitem>
  734. <listitem>
  735. <para>
  736. <methodname>getServices()</methodname>: Gibt alle hinzugefügten Services
  737. zurück.
  738. </para>
  739. </listitem>
  740. <listitem>
  741. <para>
  742. <methodname>removeService($name)</methodname>: Entfernt ein Service von der
  743. Mappe.
  744. </para>
  745. </listitem>
  746. <listitem>
  747. <para>
  748. <methodname>toArray()</methodname>: Weißt die Service Mappe einem Array zu.
  749. </para>
  750. </listitem>
  751. <listitem>
  752. <para>
  753. <methodname>toDojoArray()</methodname>: Weißt die Service Mappe einem Array
  754. zu das mit dem Dojo Toolkit kompatibel ist.
  755. </para>
  756. </listitem>
  757. <listitem>
  758. <para>
  759. <methodname>toJson()</methodname>: Weißt die Service Mappe einer
  760. <acronym>JSON</acronym> Repräsentation zu.
  761. </para>
  762. </listitem>
  763. </itemizedlist>
  764. <para>
  765. <classname>Zend_Json_Server_Smd_Service</classname> hat die folgenden Methoden:
  766. </para>
  767. <itemizedlist>
  768. <listitem>
  769. <para>
  770. <methodname>setOptions(array $options)</methodname>: Setzt den Objektstatus
  771. durch ein Array. Jeder Mutator (Methoden die mit 'set' beginnen, kann als
  772. Schlüssel verwendet und über diese Methode gesetzt werden.
  773. </para>
  774. </listitem>
  775. <listitem>
  776. <para>
  777. <methodname>setName($name)</methodname>: Setzt den Namen des Services
  778. (typischerweise die Funktion oder den Methodennamen).
  779. </para>
  780. </listitem>
  781. <listitem>
  782. <para>
  783. <methodname>getName()</methodname>: Empfängt den Servicenamen.
  784. </para>
  785. </listitem>
  786. <listitem>
  787. <para>
  788. <methodname>setTransport($transport)</methodname>: Setzt den Transport des
  789. Services (aktuell werden nur Transporte unterstützt die in
  790. <classname>Zend_Json_Server_Smd</classname> erlaubt sind).
  791. </para>
  792. </listitem>
  793. <listitem>
  794. <para>
  795. <methodname>getTransport()</methodname>: Empfängt den aktuellen Transport.
  796. </para>
  797. </listitem>
  798. <listitem>
  799. <para>
  800. <methodname>setTarget($target)</methodname>: Setzt den
  801. <acronym>URL</acronym> Endpunkt des Services (typischerweise ist das der
  802. selbe wir im gesamten SMD welchem der Service hinzugefügt wird).
  803. </para>
  804. </listitem>
  805. <listitem>
  806. <para>
  807. <methodname>getTarget()</methodname>: Gibt den <acronym>URL</acronym>
  808. Endpunkt des Services zurück.
  809. </para>
  810. </listitem>
  811. <listitem>
  812. <para>
  813. <methodname>setEnvelope($envelopeType)</methodname>: Setzt den
  814. Serviceenvelope (aktuell werden nur Envelopes unterstützt die in
  815. <classname>Zend_Json_Server_Smd</classname> erlaubt sind).
  816. </para>
  817. </listitem>
  818. <listitem>
  819. <para>
  820. <methodname>getEnvelope()</methodname>: Empfängt den Typ des
  821. Serviceenvelopes.
  822. </para>
  823. </listitem>
  824. <listitem>
  825. <para>
  826. <methodname>addParam($type, array $options = array(), $order =
  827. null)</methodname>: Fügt dem Service einen Parameter hinzu.
  828. Standardmäßig ist nur der Parametertyp notwendig. Trotzdem kann die
  829. Reihenfolge spezifiziert werden sowie auch Optionen wie:
  830. </para>
  831. <itemizedlist>
  832. <listitem>
  833. <para>
  834. <emphasis>name</emphasis>: Der Name des Parameters
  835. </para>
  836. </listitem>
  837. <listitem>
  838. <para>
  839. <emphasis>optional</emphasis>: Ob der Parameter optional ist oder
  840. nicht
  841. </para>
  842. </listitem>
  843. <listitem>
  844. <para>
  845. <emphasis>default</emphasis>: Ein Standardwert für diesen Parameter
  846. </para>
  847. </listitem>
  848. <listitem>
  849. <para>
  850. <emphasis>description</emphasis>: Ein Text der den Parameter
  851. beschreibt
  852. </para>
  853. </listitem>
  854. </itemizedlist>
  855. </listitem>
  856. <listitem>
  857. <para>
  858. <methodname>addParams(array $params)</methodname>: Fügt verschiedene
  859. Parameter auf einmal hinzu; jeder Parameter sollte ein Assoziatives Array
  860. sein das mindestens den Schlüssel 'type' enthält welches den Typ des
  861. Parameters beschreibt, und optinal den Schlüssel 'order'; jeden andere
  862. Schlüssel wird als <varname>$options</varname> an
  863. <methodname>addOption()</methodname> übergeben.
  864. </para>
  865. </listitem>
  866. <listitem>
  867. <para>
  868. <methodname>setParams(array $params)</methodname>: Setzt viele Parameter aus
  869. einmal, überschreibt alle aktuellen Parameter auf einmal.
  870. </para>
  871. </listitem>
  872. <listitem>
  873. <para>
  874. <methodname>getParams()</methodname>: Empfängt alle aktuell gesetzten
  875. Parameter.
  876. </para>
  877. </listitem>
  878. <listitem>
  879. <para>
  880. <methodname>setReturn($type)</methodname>: Setzt den Type des Rückgabewertes
  881. des Services.
  882. </para>
  883. </listitem>
  884. <listitem>
  885. <para>
  886. <methodname>getReturn()</methodname>: Empfängt den Typ des Rückgabewertes
  887. des Services.
  888. </para>
  889. </listitem>
  890. <listitem>
  891. <para>
  892. <methodname>toArray()</methodname>: Weist das Service an ein Array zu.
  893. </para>
  894. </listitem>
  895. <listitem>
  896. <para>
  897. <methodname>toJson()</methodname>: Weist das Service einer
  898. <acronym>JSON</acronym> Repräsentation zu.
  899. </para>
  900. </listitem>
  901. </itemizedlist>
  902. </sect3>
  903. </sect2>
  904. </sect1>
  905. <!--
  906. vim:se ts=4 sw=4 et:
  907. -->