Zend_Json-Server.xml 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19477 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.json.server">
  5. <title>Zend_Json_Server - servidor JSON-RPC</title>
  6. <para>
  7. <classname>Zend_Json_Server</classname>
  8. es una implementación del
  9. servidor
  10. <ulink url="http://groups.google.com/group/json-rpc/">JSON-RPC</ulink>
  11. Soporta tanto la versión 1 de la especificación
  12. <ulink url="http://json-rpc.org/wiki/specification">JSON-RPC</ulink>
  13. así como la especificación de la
  14. <ulink url="http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal">versión
  15. 2</ulink>
  16. ; además, provee una implementación de
  17. <acronym>PHP</acronym>
  18. de la especificación del
  19. <ulink url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">Service
  20. Mapping Description (SMD)</ulink>
  21. para prestar un servicio
  22. de metadatos a consumidores del servicio.
  23. </para>
  24. <para>
  25. JSON-RPC es un protocolo liviano de Remote Procedure Call que utiliza
  26. JSON para envolver sus
  27. mensajes. Esta implementación JSON-RPC sigue la
  28. <acronym>API</acronym>
  29. <acronym>PHP</acronym>
  30. de
  31. <ulink url="http://us.php.net/manual/en/function.soap-soapserver-construct.php">SoapServer</ulink>
  32. . Esto significa que, en una situación típica,
  33. simplemente:
  34. </para>
  35. <itemizedlist>
  36. <listitem>
  37. <para>Instancia el objeto servidor</para>
  38. </listitem>
  39. <listitem>
  40. <para>Agrega una o más funciones y/o clases/objetos al objeto
  41. servidor para</para>
  42. </listitem>
  43. <listitem>
  44. <para>handle() -- maneja -- el requerimiento</para>
  45. </listitem>
  46. </itemizedlist>
  47. <para>
  48. <classname>Zend_Json_Server</classname>
  49. utiliza
  50. <xref linkend="zend.server.reflection"/>
  51. para realizar reflexión sobre
  52. cualquiera de las clases o funciones agregadas, y utiliza esa
  53. información para construir tanto la SMD y hacer cumplir el método de
  54. llamado de firmas. Como
  55. tal, es imperativo que cualquier de las
  56. funciones agregadas y/o los métodos de clase tengan
  57. mínimamente una
  58. plena documentación de
  59. <acronym>PHP</acronym>
  60. docblocks:
  61. </para>
  62. <itemizedlist>
  63. <listitem>
  64. <para>Todos los parámetros y sus tipos de variables esperados</para>
  65. </listitem>
  66. <listitem>
  67. <para>El tipo de variable del valor de retorno</para>
  68. </listitem>
  69. </itemizedlist>
  70. <para>
  71. <classname>Zend_Json_Server</classname>
  72. escucha por solicitudes POST
  73. únicamente en este momento; afortunadamente, la mayoría de las
  74. implementaciones del cliente JSON-RPC en los medios en el momento de
  75. escribir esto, sólo
  76. requieren a POST como es. Esto hace que sea fácil de
  77. utilizar el mismo punto final del
  78. servidor para manejar a ambas
  79. peticiones así como para entregar el servicio SMD, como se
  80. muestra en el
  81. siguiente ejemplo.
  82. </para>
  83. <example id="zend.json.server.usage">
  84. <title>Uso de Zend_Json_Server</title>
  85. <para>Primero, definir una clase que queramos exponer vía servidor
  86. JSON-RPC. Vamos a la clase
  87. 'Calculator', y definir los métodos para
  88. 'add', 'subtract', 'multiply', y 'divide':</para>
  89. <programlisting language="php"><![CDATA[
  90. /**
  91. * Calculator - clase de ejemplo para exponer via JSON-RPC
  92. */
  93. class Calculator
  94. {
  95. /**
  96. * Devuelve la suma de dos variables
  97. *
  98. * @param int $x
  99. * @param int $y
  100. * @return int
  101. */
  102. public function add($x, $y)
  103. {
  104. return $x + $y;
  105. }
  106. /**
  107. * Devuelve la diferencia de dos variables
  108. *
  109. * @param int $x
  110. * @param int $y
  111. * @return int
  112. */
  113. public function subtract($x, $y)
  114. {
  115. return $x - $y;
  116. }
  117. /**
  118. * Devuelve el producto de dos variables
  119. *
  120. * @param int $x
  121. * @param int $y
  122. * @return int
  123. */
  124. public function multiply($x, $y)
  125. {
  126. return $x * $y;
  127. }
  128. /**
  129. * Devuelve la división de dos variables
  130. *
  131. * @param int $x
  132. * @param int $y
  133. * @return float
  134. */
  135. public function divide($x, $y)
  136. {
  137. return $x / $y;
  138. }
  139. }
  140. ]]></programlisting>
  141. <para>
  142. Nótese que cada método tiene un docblock con entradas indicando
  143. cada parámetro y su tipo,
  144. así como una entrada para el valor de
  145. retorno. Esto es
  146. <emphasis>absolutamente crítico</emphasis>
  147. cuando
  148. se usa
  149. <classname>Zend_Json_Server</classname>
  150. -- o cualquier otro
  151. componente del servidor en Zend Framework, por esa cuestión.
  152. </para>
  153. <para>Ahora, crearemos un script para manejar las peticiones:</para>
  154. <programlisting language="php"><![CDATA[
  155. $server = new Zend_Json_Server();
  156. // Indicar que funcionalidad está disponible:
  157. $server->setClass('Calculator');
  158. // Manejar el requerimiento:
  159. $server->handle();
  160. ]]></programlisting>
  161. <para>
  162. Sin embargo, esto no soluciona el problema de devolución de un
  163. SMD para que el cliente
  164. JSON-RPC pueda autodescubrir los métodos.
  165. Esto puede lograrse determinando el método del
  166. requerimiento
  167. <acronym>HTTP</acronym>
  168. , y
  169. luego especificando algún servidor de metadatos:
  170. </para>
  171. <programlisting language="php"><![CDATA[
  172. $server = new Zend_Json_Server();
  173. $server->setClass('Calculator');
  174. if ('GET' == $_SERVER['REQUEST_METHOD']) {
  175. // Indica el punto final de la URL, y la versión en uso de JSON-RPC:
  176. $server->setTarget('/json-rpc.php')
  177. ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
  178. // Capturar el SMD
  179. $smd = $server->getServiceMap();
  180. // Devolver el SMD al cliente
  181. header('Content-Type: application/json');
  182. echo $smd;
  183. return;
  184. }
  185. $server->handle();
  186. ]]></programlisting>
  187. <para>Si utiliza el servidor JSON-RPC con Dojo toolkit, también
  188. necesitará establecer un flag
  189. de compatibilidad especial para
  190. garantizar que los dos interoperen correctamente:</para>
  191. <programlisting language="php"><![CDATA[
  192. $server = new Zend_Json_Server();
  193. $server->setClass('Calculator');
  194. if ('GET' == $_SERVER['REQUEST_METHOD']) {
  195. $server->setTarget('/json-rpc.php')
  196. ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
  197. $smd = $server->getServiceMap();
  198. // Establecer la compatibilidad con Dojo:
  199. $smd->setDojoCompatible(true);
  200. header('Content-Type: application/json');
  201. echo $smd;
  202. return;
  203. }
  204. $server->handle();
  205. ]]></programlisting>
  206. </example>
  207. <sect2 id="zend.json.server.details">
  208. <title>Detalles Avanzados</title>
  209. <para>
  210. Aunque la mayor funcionalidad de
  211. <classname>Zend_Json_Server</classname>
  212. se puntualiza en
  213. <xref linkend="zend.json.server.usage"/>
  214. , hay más funcionalidad
  215. avanzada disponible.
  216. </para>
  217. <sect3 id="zend.json.server.details.zendjsonserver">
  218. <title>Zend_Json_Server</title>
  219. <para>
  220. <classname>Zend_Json_Server</classname>
  221. es la clase núcleo en la
  222. propuesta JSON-RPC; que maneja todas las peticiones y como
  223. respuesta devuelve un conjunto de datos. Tiene los siguientes
  224. métodos:
  225. </para>
  226. <itemizedlist>
  227. <listitem>
  228. <para>
  229. <methodname>addFunction($function)</methodname>
  230. :
  231. Especifica la función de espacio del usuario para
  232. agregar al servidor.
  233. </para>
  234. </listitem>
  235. <listitem>
  236. <para>
  237. <methodname>setClass($class)</methodname>
  238. : Especifica
  239. una clase u objeto para agregar al servidor; todos los
  240. métodos
  241. públicos de ese item serán expuestos como
  242. métodos JSON-RPC.
  243. </para>
  244. </listitem>
  245. <listitem>
  246. <para>
  247. <methodname>fault($fault = null, $code = 404, $data =
  248. null)</methodname>
  249. : Crea y devuelve un objeto
  250. <classname>Zend_Json_Server_Error</classname>
  251. .
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. <methodname>handle($request = false)</methodname>
  257. :
  258. Maneja una solicitud JSON-RPC; opcionalmente, pasa un
  259. objeto
  260. <classname>Zend_Json_Server_Request</classname>
  261. a
  262. utlizar (crea uno por defecto).
  263. </para>
  264. </listitem>
  265. <listitem>
  266. <para>
  267. <methodname>getFunctions()</methodname>
  268. : Devuelve una
  269. lista de todos los métodos agregados.
  270. </para>
  271. </listitem>
  272. <listitem>
  273. <para>
  274. <methodname>setRequest(Zend_Json_Server_Request
  275. $request)</methodname>
  276. : Especifica un objeto
  277. solicitud para el servidor a utilizar.
  278. </para>
  279. </listitem>
  280. <listitem>
  281. <para>
  282. <methodname>getRequest()</methodname>
  283. : Recupera el
  284. objeto solicitud usado por el servidor.
  285. </para>
  286. </listitem>
  287. <listitem>
  288. <para>
  289. <methodname>setResponse(Zend_Json_Server_Response
  290. $response)</methodname>
  291. : Establece el objeto
  292. respuesta para el servidor a utilizar.
  293. </para>
  294. </listitem>
  295. <listitem>
  296. <para>
  297. <methodname>getResponse()</methodname>
  298. : Recupera el
  299. objeto respuesta usado por el servidor.
  300. </para>
  301. </listitem>
  302. <listitem>
  303. <para>
  304. <methodname>setAutoEmitResponse($flag)</methodname>
  305. :
  306. Indica si el servidor debería emitir automáticamente la
  307. respuesta y todas
  308. las cabeceras; por defecto, esto es
  309. verdadero.
  310. </para>
  311. </listitem>
  312. <listitem>
  313. <para>
  314. <methodname>autoEmitResponse()</methodname>
  315. : Determina
  316. si la auto-emisión de la respuesta está
  317. habilitada.
  318. </para>
  319. </listitem>
  320. <listitem>
  321. <para>
  322. <methodname>getServiceMap()</methodname>
  323. : Recupera la
  324. descripción del mapa de servicio en el form de un objeto
  325. <classname>Zend_Json_Server_Smd</classname>
  326. .
  327. </para>
  328. </listitem>
  329. </itemizedlist>
  330. </sect3>
  331. <sect3 id="zend.json.server.details.zendjsonserverrequest">
  332. <title>Zend_Json_Server_Request</title>
  333. <para>
  334. El medio ambiente de una solicitud JSON-RPC está encapsulado
  335. en el objeto
  336. <classname>Zend_Json_Server_Request</classname>
  337. .
  338. Este objeto le permite establecer porciones necesarias de la
  339. solicitud JSON-RPC,
  340. incluida el ID de la solicitud, parámetros y
  341. especificaciones de la versión JSON-RPC.
  342. Tiene la capacidad de
  343. cargarse a sí mismo via JSON o un conjunto de opciones, y puede
  344. mostrase a si mismo como JSON vía el método
  345. <methodname>toJson()</methodname>
  346. .
  347. </para>
  348. <para>El objeto solicitud tiene los siguientes métodos disponibles:</para>
  349. <itemizedlist>
  350. <listitem>
  351. <para>
  352. <methodname>setOptions(array $options)</methodname>
  353. :
  354. Especifica la configuración del objeto.
  355. <varname>$options</varname>
  356. puede contener claves
  357. que concuerden con cualuier método 'set':
  358. <methodname>setParams()</methodname>
  359. ,
  360. <methodname>setMethod()</methodname>
  361. ,
  362. <methodname>setId()</methodname>
  363. , y
  364. <methodname>setVersion()</methodname>
  365. .
  366. </para>
  367. </listitem>
  368. <listitem>
  369. <para>
  370. <methodname>addParam($value, $key =
  371. null)</methodname>
  372. : Agrega un parámetro para usar con el
  373. método de llamada. Los parámetros
  374. pueden ser sólo los
  375. valores, o pueden incluir opcionalmente el nombre del
  376. parámetro.
  377. </para>
  378. </listitem>
  379. <listitem>
  380. <para>
  381. <methodname>addParams(array $params)</methodname>
  382. :
  383. Agrega múltiples parámetros a la vez; proxies a
  384. <methodname>addParam()</methodname>
  385. </para>
  386. </listitem>
  387. <listitem>
  388. <para>
  389. <methodname>setParams(array $params)</methodname>
  390. :
  391. Establece todos los parámetros a la vez; sobrescribe
  392. cualquiera de los
  393. parámetros existentes.
  394. </para>
  395. </listitem>
  396. <listitem>
  397. <para>
  398. <methodname>getParam($index)</methodname>
  399. : Recupera un
  400. parámetro por posición o por el nombre.
  401. </para>
  402. </listitem>
  403. <listitem>
  404. <para>
  405. <methodname>getParams()</methodname>
  406. : Recupera todos
  407. los parámetros a la vez.
  408. </para>
  409. </listitem>
  410. <listitem>
  411. <para>
  412. <methodname>setMethod($name)</methodname>
  413. : Establece
  414. el método para llamar.
  415. </para>
  416. </listitem>
  417. <listitem>
  418. <para>
  419. <methodname>getMethod()</methodname>
  420. : Recupera el
  421. método que será llamado.
  422. </para>
  423. </listitem>
  424. <listitem>
  425. <para>
  426. <methodname>isMethodError()</methodname>
  427. : Determinar
  428. si la solicitud está malformada o no y si daría como
  429. resultado un
  430. error.
  431. </para>
  432. </listitem>
  433. <listitem>
  434. <para>
  435. <methodname>setId($name)</methodname>
  436. : Establecer el
  437. identificador de solicitud(utilizado por el cliente para
  438. igualar las solicitudes de respuestas).
  439. </para>
  440. </listitem>
  441. <listitem>
  442. <para>
  443. <methodname>getId()</methodname>
  444. : Recuperar el
  445. identificador de solicitudes.
  446. </para>
  447. </listitem>
  448. <listitem>
  449. <para>
  450. <methodname>setVersion($version)</methodname>
  451. :
  452. Establecer la versión de la especificación JSON-RPC que
  453. conforma la
  454. solicitud. Puede ser '1.0' o '2.0'.
  455. </para>
  456. </listitem>
  457. <listitem>
  458. <para>
  459. <methodname>getVersion()</methodname>
  460. : Recuperar la
  461. versión de la especificación JSON-RPC utilizados por la
  462. solicitud.
  463. </para>
  464. </listitem>
  465. <listitem>
  466. <para>
  467. <methodname>loadJson($json)</methodname>
  468. : Cargar el
  469. objeto solicitud de una cadena JSON.
  470. </para>
  471. </listitem>
  472. <listitem>
  473. <para>
  474. <methodname>toJson()</methodname>
  475. : Mostrar la
  476. solicitud como un string JSON.
  477. </para>
  478. </listitem>
  479. </itemizedlist>
  480. <para>
  481. Una versión específica de
  482. <acronym>HTTP</acronym>
  483. está disponible a través de
  484. <classname>Zend_Json_Server_Request_Http</classname>
  485. . Esta
  486. clase podrá recuperar la solicitud via
  487. <methodname>php://input</methodname>
  488. , y permite el acceso
  489. JSON sin procesar vía el método
  490. <methodname>getRawJson()</methodname>
  491. .
  492. </para>
  493. </sect3>
  494. <sect3 id="zend.json.server.details.zendjsonserverresponse">
  495. <title>Zend_Json_Server_Response</title>
  496. <para>
  497. La respuesta del conjunto de datos JSON-RPC es encapsulada en
  498. el objeto
  499. <classname>Zend_Json_Server_Response</classname>
  500. . Este
  501. objeto le permite ajustar el valor de retorno de la solicitud,
  502. siendo la
  503. respuesta un error o no, el identificador de
  504. solicitud, con que versión de
  505. especificación esta conformada la
  506. respuesta de JSON-RPC, y, opcionalmente el mapa de
  507. servicio.
  508. </para>
  509. <para>El objeto respuesta tiene los siguientes métodos disponibles:</para>
  510. <itemizedlist>
  511. <listitem>
  512. <para>
  513. <methodname>setResult($value)</methodname>
  514. : Establecer
  515. el resultado de la respuesta.
  516. </para>
  517. </listitem>
  518. <listitem>
  519. <para>
  520. <methodname>getResult()</methodname>
  521. : Recuperar el
  522. resultado de la respuesta.
  523. </para>
  524. </listitem>
  525. <listitem>
  526. <para>
  527. <methodname>setError(Zend_Json_Server_Error
  528. $error)</methodname>
  529. : Establecer un objeto error. Si
  530. ya está, este será utilizado como la
  531. respuesta cuando se
  532. serialize a JSON.
  533. </para>
  534. </listitem>
  535. <listitem>
  536. <para>
  537. <methodname>getError()</methodname>
  538. : Recuperar el
  539. objeto error, si lo hubiera.
  540. </para>
  541. </listitem>
  542. <listitem>
  543. <para>
  544. <methodname>isError()</methodname>
  545. : Si la respuesta es
  546. una respuesta de error o no.
  547. </para>
  548. </listitem>
  549. <listitem>
  550. <para>
  551. <methodname>setId($name)</methodname>
  552. : Establecer el
  553. identificador de solicitud (de manera que la respuesta
  554. del
  555. cliente pueda coincidir con la solicitud original).
  556. </para>
  557. </listitem>
  558. <listitem>
  559. <para>
  560. <methodname>getId()</methodname>
  561. : Recuperar el
  562. identificador de solicitud.
  563. </para>
  564. </listitem>
  565. <listitem>
  566. <para>
  567. <methodname>setVersion($version)</methodname>
  568. :
  569. Establecer la versión JSON-RPC con la que deba estar
  570. conformada la
  571. respuesta.
  572. </para>
  573. </listitem>
  574. <listitem>
  575. <para>
  576. <methodname>getVersion()</methodname>
  577. : Recuperar la
  578. versión JSON-RPC con la cumple la respuesta.
  579. </para>
  580. </listitem>
  581. <listitem>
  582. <para>
  583. <methodname>toJson()</methodname>
  584. : Serializar la
  585. respuesta a JSON. Si la respuesta es una respuesta de
  586. error,
  587. serializar el objeto error.
  588. </para>
  589. </listitem>
  590. <listitem>
  591. <para>
  592. <methodname>setServiceMap($serviceMap)</methodname>
  593. :
  594. Establecer el objeto mapa de servicio para la respuesta.
  595. </para>
  596. </listitem>
  597. <listitem>
  598. <para>
  599. <methodname>getServiceMap()</methodname>
  600. : Recuperar el
  601. objeto mapa de servicio, si hubiera alguno.
  602. </para>
  603. </listitem>
  604. </itemizedlist>
  605. <para>
  606. Una versión específica de
  607. <acronym>HTTP</acronym>
  608. está disponible a través de
  609. <classname>Zend_Json_Server_Response_Http</classname>
  610. . Esta
  611. clase enviará las cabeceras
  612. <acronym>HTTP</acronym>
  613. apropiadas así como serializará
  614. la respuesta como
  615. <acronym>JSON</acronym>
  616. .
  617. </para>
  618. </sect3>
  619. <sect3 id="zend.json.server.details.zendjsonservererror">
  620. <title>Zend_Json_Server_Error</title>
  621. <para>JSON-RPC tiene un formato especial para informar condiciones
  622. de error. Todos los
  623. errores necesitan proporcionar, mínimamente,
  624. un mensaje de error y un código de
  625. error; opcionalmente, pueden
  626. proporcionar datos adicionales, tales como un backtrace.</para>
  627. <para>
  628. Los códigos de error derivan de los recomendados por
  629. <ulink url="http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php">el
  630. proyecto XML-RPC EPI</ulink>
  631. .
  632. <classname>Zend_Json_Server</classname>
  633. apropiadamente
  634. asigna el código sobre la base de la condición de error. Para
  635. las
  636. excepciones de la aplicación, se utiliza el código '-32000'.
  637. </para>
  638. <para>
  639. <classname>Zend_Json_Server_Error</classname>
  640. expone los
  641. siguientes métodos:
  642. </para>
  643. <itemizedlist>
  644. <listitem>
  645. <para>
  646. <methodname>setCode($code)</methodname>
  647. : Establece el
  648. código de error; si el código de error no está en el
  649. rango de
  650. aceptación de XML-RPC, -32000 será
  651. asignado.
  652. </para>
  653. </listitem>
  654. <listitem>
  655. <para>
  656. <methodname>getCode()</methodname>
  657. : Recuperar el
  658. actual código de error.
  659. </para>
  660. </listitem>
  661. <listitem>
  662. <para>
  663. <methodname>setMessage($message)</methodname>
  664. :
  665. Establecer el mensaje de error.
  666. </para>
  667. </listitem>
  668. <listitem>
  669. <para>
  670. <methodname>getMessage()</methodname>
  671. : Recuperar el
  672. mensaje de error actual.
  673. </para>
  674. </listitem>
  675. <listitem>
  676. <para>
  677. <methodname>setData($data)</methodname>
  678. : Establecer el
  679. conjunto de datos auxiliares para calificar más adelante
  680. el
  681. error, tal como un backtrace.
  682. </para>
  683. </listitem>
  684. <listitem>
  685. <para>
  686. <methodname>getData()</methodname>
  687. : Recuperar
  688. cualquier auxiliar actual de errores de datos.
  689. </para>
  690. </listitem>
  691. <listitem>
  692. <para>
  693. <methodname>toArray()</methodname>
  694. : Mandar el error a
  695. un array. El array contendrá las claves 'code',
  696. 'message', y 'data'.
  697. </para>
  698. </listitem>
  699. <listitem>
  700. <para>
  701. <methodname>toJson()</methodname>
  702. : Mandar el error a
  703. una representación de error JSON-RPC.
  704. </para>
  705. </listitem>
  706. </itemizedlist>
  707. </sect3>
  708. <sect3 id="zend.json.server.details.zendjsonserversmd">
  709. <title>Zend_Json_Server_Smd</title>
  710. <para>
  711. SMD quiere decir Service Mapping Description, un esquema JSON
  712. que define cómo un
  713. cliente puede interactuar con un servicio web
  714. en particular. En el momento de
  715. escribir esto, la
  716. <ulink
  717. url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal"
  718. >especificación</ulink>
  719. todavía no ha sido ratificada
  720. oficialmente, pero ya está en uso en Dojo toolkit así
  721. como en
  722. otros clientes consumidores de JSON-RPC.
  723. </para>
  724. <para>
  725. En su aspecto más básico, un SMD indica el método de
  726. transporte (POST, GET, TCP/IP,
  727. etc), el tipo de envoltura de la
  728. solicitud (generalmente se basa en el protocolo del
  729. servidor),
  730. el objetivo
  731. <acronym>URL</acronym>
  732. del proveedor del servicio, y
  733. un mapa de los servicios disponibles. En el caso de
  734. JSON-RPC, el
  735. servicio de mapa es una lista de los métodos disponibles, en el
  736. que cada
  737. método documenta los parámetros disponibles y sus
  738. tipos, así como los tipos de
  739. valores esperados a devolver.
  740. </para>
  741. <para>
  742. <classname>Zend_Json_Server_Smd</classname>
  743. Proporciona un
  744. objeto orientado para construir servicios de mapas. Básicamente,
  745. pasa
  746. los metadatos describiendo el servicio usando mutators, y
  747. especifica los servicios
  748. (métodos y funciones).
  749. </para>
  750. <para>
  751. Las descripciones de los servicios son típicamente instancias
  752. de
  753. <classname>Zend_Json_Server_Smd_Service</classname>
  754. ; también
  755. puede pasar toda la información como un array a los diversos
  756. mutators de
  757. servicios en
  758. <classname>Zend_Json_Server_Smd</classname>
  759. , y que
  760. instanciará on objeto de servicio por usted. Los objetos de
  761. servicio contienen
  762. información como el nombre del servicio
  763. (típicamente, la función o el nombre del
  764. método), los parámetros
  765. (nombres, tipos y posición), y el tipo del valor de retorno.
  766. Opcionalmente, cada servicio puede tener su propio objetivo y
  767. envoltura, aunque esta
  768. funcionalidad rara vez es utilizada.
  769. </para>
  770. <para>
  771. <classname>Zend_Json_Server</classname>
  772. Realmente todo esto
  773. sucede entre bambalinas para usted, utilizando reflexión sobre
  774. las clases y funciones agregadas; debe crear su propio servicio
  775. de mapas sólo si
  776. necesita brindar funcionalidad personalizada
  777. que la introspección de clase y función
  778. no puede ofrecer.
  779. </para>
  780. <para>
  781. Los métodos disponibles en
  782. <classname>Zend_Json_Server_Smd</classname>
  783. incluyen:
  784. </para>
  785. <itemizedlist>
  786. <listitem>
  787. <para>
  788. <methodname>setOptions(array $options)</methodname>
  789. :
  790. Establecer un objeto SMD desde un array de opciones.
  791. Todos los mutators
  792. (métodos comenzando con 'set') se
  793. pueden usar como claves.
  794. </para>
  795. </listitem>
  796. <listitem>
  797. <para>
  798. <methodname>setTransport($transport)</methodname>
  799. :
  800. Establecer el transporte usado para acceder al servicio;
  801. únicamente POST es
  802. actualmente soportado.
  803. </para>
  804. </listitem>
  805. <listitem>
  806. <para>
  807. <methodname>getTransport()</methodname>
  808. : Obtener el
  809. servicio de transporte actual.
  810. </para>
  811. </listitem>
  812. <listitem>
  813. <para>
  814. <methodname>setEnvelope($envelopeType)</methodname>
  815. :
  816. Establecer la envoltura de la solicitud que debería ser
  817. utilizada para
  818. acceder al servicio. Actualmente las
  819. constantes soportadas son
  820. <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant>
  821. y
  822. <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant>
  823. .
  824. </para>
  825. </listitem>
  826. <listitem>
  827. <para>
  828. <methodname>getEnvelope()</methodname>
  829. : Obtener la
  830. envoltura de la petición actual.
  831. </para>
  832. </listitem>
  833. <listitem>
  834. <para>
  835. <methodname>setContentType($type)</methodname>
  836. :
  837. Establecer el tipo de contenido que deben utilizar las
  838. solicitudes (por
  839. defecto, es 'application/json»).
  840. </para>
  841. </listitem>
  842. <listitem>
  843. <para>
  844. <methodname>getContentType()</methodname>
  845. : Conseguir
  846. el tipo del contenido actual para las solicitudes al
  847. servicio.
  848. </para>
  849. </listitem>
  850. <listitem>
  851. <para>
  852. <methodname>setTarget($target)</methodname>
  853. :
  854. Establecer el punto final de la
  855. <acronym>URL</acronym>
  856. para el servicio.
  857. </para>
  858. </listitem>
  859. <listitem>
  860. <para>
  861. <methodname>getTarget()</methodname>
  862. : Obtener el punto
  863. final de la
  864. <acronym>URL</acronym>
  865. para el
  866. servicio.
  867. </para>
  868. </listitem>
  869. <listitem>
  870. <para>
  871. <methodname>setId($id)</methodname>
  872. : Normalmente, este
  873. es el punto final de la
  874. <acronym>URL</acronym>
  875. del
  876. servicio (igual que el objetivo).
  877. </para>
  878. </listitem>
  879. <listitem>
  880. <para>
  881. <methodname>getId()</methodname>
  882. : Recuperar el ID del
  883. servicio (normalmente el punto final de la
  884. <acronym>URL</acronym>
  885. del servicio).
  886. </para>
  887. </listitem>
  888. <listitem>
  889. <para>
  890. <methodname>setDescription($description)</methodname>
  891. :
  892. Establecer una descripción del servicio (típicamente
  893. información narrativa
  894. que describe el propósito del
  895. servicio).
  896. </para>
  897. </listitem>
  898. <listitem>
  899. <para>
  900. <methodname>getDescription()</methodname>
  901. : Obtener la
  902. descripción del servicio.
  903. </para>
  904. </listitem>
  905. <listitem>
  906. <para>
  907. <methodname>setDojoCompatible($flag)</methodname>
  908. :
  909. Establecer un flag que indique si el SMD es compatible o
  910. no con el toolkit
  911. de Dojo. Cuando sea verdadero, el
  912. <acronym>JSON</acronym>
  913. SMD será formateado para cumplir con el formato que
  914. espera el cliente de Dojo
  915. JSON-RPC.
  916. </para>
  917. </listitem>
  918. <listitem>
  919. <para>
  920. <methodname>isDojoCompatible()</methodname>
  921. : Devuelve
  922. el valor del flag de compatibilidad de Dojo (falso, por
  923. defecto).
  924. </para>
  925. </listitem>
  926. <listitem>
  927. <para>
  928. <methodname>addService($service)</methodname>
  929. : Añade
  930. un servicio al mapa. Puede ser un array de información a
  931. pasar al
  932. constructor de
  933. <classname>Zend_Json_Server_Smd_Service</classname>
  934. ,
  935. o una instancia de esa clase.
  936. </para>
  937. </listitem>
  938. <listitem>
  939. <para>
  940. <methodname>addServices(array $services)</methodname>
  941. :
  942. Agrega múltiples servicios a la vez.
  943. </para>
  944. </listitem>
  945. <listitem>
  946. <para>
  947. <methodname>setServices(array $services)</methodname>
  948. :
  949. Agrega múltiples servicios a la vez, sobreescribiendo
  950. cualquiera de los
  951. servicios previamente establecidos.
  952. </para>
  953. </listitem>
  954. <listitem>
  955. <para>
  956. <methodname>getService($name)</methodname>
  957. : Ontiene el
  958. servicio por su nombre.
  959. </para>
  960. </listitem>
  961. <listitem>
  962. <para>
  963. <methodname>getServices()</methodname>
  964. : Obtener todos
  965. los servicios agregados.
  966. </para>
  967. </listitem>
  968. <listitem>
  969. <para>
  970. <methodname>removeService($name)</methodname>
  971. : Elimina
  972. un servicio del mapa.
  973. </para>
  974. </listitem>
  975. <listitem>
  976. <para>
  977. <methodname>toArray()</methodname>
  978. : Mandar el mapa de
  979. servicio a un array.
  980. </para>
  981. </listitem>
  982. <listitem>
  983. <para>
  984. <methodname>toDojoArray()</methodname>
  985. : Mandar el mapa
  986. de servicio a un array compatible con Dojo
  987. Toolkit.
  988. </para>
  989. </listitem>
  990. <listitem>
  991. <para>
  992. <methodname>toJson()</methodname>
  993. : Mandar el mapa de
  994. servicio a una representación JSON.
  995. </para>
  996. </listitem>
  997. </itemizedlist>
  998. <para>
  999. <classname>Zend_Json_Server_Smd_Service</classname>
  1000. tiene los
  1001. siguientes métodos:
  1002. </para>
  1003. <itemizedlist>
  1004. <listitem>
  1005. <para>
  1006. <methodname>setOptions(array $options)</methodname>
  1007. :
  1008. Establecer el estado del objeto dede un array. Cualquier
  1009. mutator (métodos
  1010. comenzando con 'set') puede ser
  1011. utilizado como una clave y establecerlo
  1012. mediante este
  1013. método.
  1014. </para>
  1015. </listitem>
  1016. <listitem>
  1017. <para>
  1018. <methodname>setName($name)</methodname>
  1019. : Establecer el
  1020. nombre del servicio (típicamente, la función o el nombre
  1021. del
  1022. método).
  1023. </para>
  1024. </listitem>
  1025. <listitem>
  1026. <para>
  1027. <methodname>getName()</methodname>
  1028. : Recuperar el
  1029. nombre del servicio.
  1030. </para>
  1031. </listitem>
  1032. <listitem>
  1033. <para>
  1034. <methodname>setTransport($transport)</methodname>
  1035. :
  1036. Establecer el servicio de transporte (actualmente, sólo
  1037. transportes apoyados
  1038. por
  1039. <classname>Zend_Json_Server_Smd</classname>
  1040. son
  1041. permitidos).
  1042. </para>
  1043. </listitem>
  1044. <listitem>
  1045. <para>
  1046. <methodname>getTransport()</methodname>
  1047. : Recuperar el
  1048. transporte actual.
  1049. </para>
  1050. </listitem>
  1051. <listitem>
  1052. <para>
  1053. <methodname>setTarget($target)</methodname>
  1054. :
  1055. Establecer el punto final de la
  1056. <acronym>URL</acronym>
  1057. del servicio (típicamente, este será el mismo que el SMD
  1058. en general, al cual
  1059. el servicio está agregado).
  1060. </para>
  1061. </listitem>
  1062. <listitem>
  1063. <para>
  1064. <methodname>getTarget()</methodname>
  1065. : Obtener el punto
  1066. final de la
  1067. <acronym>URL</acronym>
  1068. del servicio.
  1069. </para>
  1070. </listitem>
  1071. <listitem>
  1072. <para>
  1073. <methodname>setEnvelope($envelopeType)</methodname>
  1074. :
  1075. Establecer la envoltura del servicio (actualmente, sólo
  1076. se permiten las
  1077. envolturas soportadas por
  1078. <classname>Zend_Json_Server_Smd</classname>
  1079. .
  1080. </para>
  1081. </listitem>
  1082. <listitem>
  1083. <para>
  1084. <methodname>getEnvelope()</methodname>
  1085. : Recuperar el
  1086. tipo de envoltura del servicio.
  1087. </para>
  1088. </listitem>
  1089. <listitem>
  1090. <para>
  1091. <methodname>addParam($type, array $options = array(),
  1092. $order = null)</methodname>
  1093. : Añadir un parámetro
  1094. para el servicio. Por defecto, sólo el tipo de
  1095. parámetro
  1096. es necesario. Sin embargo, también puede especificar el
  1097. orden, así
  1098. como opciones tales como:
  1099. </para>
  1100. <itemizedlist>
  1101. <listitem>
  1102. <para>
  1103. <emphasis>name</emphasis>
  1104. : el nombre del
  1105. parámetro
  1106. </para>
  1107. </listitem>
  1108. <listitem>
  1109. <para>
  1110. <emphasis>optional</emphasis>
  1111. : cuándo el
  1112. parámetro es opcional o no
  1113. </para>
  1114. </listitem>
  1115. <listitem>
  1116. <para>
  1117. <emphasis>default</emphasis>
  1118. : un valor por
  1119. defecto para el parámetro
  1120. </para>
  1121. </listitem>
  1122. <listitem>
  1123. <para>
  1124. <emphasis>description</emphasis>
  1125. : texto
  1126. describiendo el parámetro
  1127. </para>
  1128. </listitem>
  1129. </itemizedlist>
  1130. </listitem>
  1131. <listitem>
  1132. <para>
  1133. <methodname>addParams(array $params)</methodname>
  1134. :
  1135. Agregar varios parámetros a la vez; cada param debería
  1136. ser un array
  1137. asociativo conteniendo mínimamente la clave
  1138. 'type' describiendo el tipo de
  1139. parámetro y,
  1140. opcionalmente la clave 'order'; cualquiera de las otras
  1141. claves
  1142. serán pasados como
  1143. <varname>$options</varname>
  1144. a
  1145. <methodname>addOption()</methodname>
  1146. .
  1147. </para>
  1148. </listitem>
  1149. <listitem>
  1150. <para>
  1151. <methodname>setParams(array $params)</methodname>
  1152. :
  1153. Establecer muchos parámetros a la vez, sobrescribiendo
  1154. cualquiera de los
  1155. parámetros existentes.
  1156. </para>
  1157. </listitem>
  1158. <listitem>
  1159. <para>
  1160. <methodname>getParams()</methodname>
  1161. : Recuperar todos
  1162. los parámetros actualmente establecidos.
  1163. </para>
  1164. </listitem>
  1165. <listitem>
  1166. <para>
  1167. <methodname>setReturn($type)</methodname>
  1168. : Establecer
  1169. el tipo del valor de retorno del servicio.
  1170. </para>
  1171. </listitem>
  1172. <listitem>
  1173. <para>
  1174. <methodname>getReturn()</methodname>
  1175. : Obtener el tipo
  1176. del valor de retorno del servicio.
  1177. </para>
  1178. </listitem>
  1179. <listitem>
  1180. <para>
  1181. <methodname>toArray()</methodname>
  1182. : Mandar el servicio
  1183. a un array.
  1184. </para>
  1185. </listitem>
  1186. <listitem>
  1187. <para>
  1188. <methodname>toJson()</methodname>
  1189. : Mandar el servicio
  1190. a una representación
  1191. <acronym>JSON</acronym>
  1192. .
  1193. </para>
  1194. </listitem>
  1195. </itemizedlist>
  1196. </sect3>
  1197. </sect2>
  1198. </sect1>