Zend_Json-Server.xml 41 KB

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