Zend_Json-Server.xml 41 KB

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