Zend_Json-Server.xml 40 KB

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