<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 20792 -->
    <!-- Reviewed: no -->
<sect1 id="zend.json.server">
    <title>Zend_Json_Server - servidor JSON-RPC</title>

    <para>
        <classname>Zend_Json_Server</classname> es una implementación del
        servidor <ulink url="http://groups.google.com/group/json-rpc/"
            >JSON-RPC</ulink> Soporta tanto la versión 1 de la especificación
            <ulink url="http://json-rpc.org/wiki/specification">JSON-RPC</ulink>
        así como la especificación de la <ulink
            url="http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal"
            >versión 2</ulink> ; además, provee una implementación de
            <acronym>PHP</acronym> de la especificación del <ulink
            url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal"
            >Service Mapping Description (SMD)</ulink> para prestar un servicio
        de metadatos a consumidores del servicio. </para>

    <para> JSON-RPC es un protocolo liviano de Remote Procedure Call que utiliza
        JSON para envolver sus mensajes. Esta implementación JSON-RPC sigue la
            <acronym>API</acronym>
        <acronym>PHP</acronym> de <ulink
            url="http://us.php.net/manual/en/function.soap-soapserver-construct.php"
            >SoapServer</ulink> . Esto significa que, en una situación típica,
        simplemente: </para>

    <itemizedlist>
        <listitem>
            <para>Instancia el objeto servidor</para>
        </listitem>
        <listitem>
            <para>Agrega una o más funciones y/o clases/objetos al objeto
                servidor para</para>
        </listitem>
        <listitem>
            <para>handle() -- maneja -- el requerimiento</para>
        </listitem>
    </itemizedlist>

    <para>
        <classname>Zend_Json_Server</classname> utiliza <xref
            linkend="zend.server.reflection"/> para realizar reflexión sobre
        cualquiera de las clases o funciones agregadas, y utiliza esa
        información para construir tanto la SMD y hacer cumplir el método de
        llamado de firmas. Como tal, es imperativo que cualquier de las
        funciones agregadas y/o los métodos de clase tengan mínimamente una
        plena documentación de <acronym>PHP</acronym> docblocks: </para>

    <itemizedlist>
        <listitem>
            <para>Todos los parámetros y sus tipos de variables esperados</para>
        </listitem>
        <listitem>
            <para>El tipo de variable del valor de retorno</para>
        </listitem>
    </itemizedlist>

    <para>
        <classname>Zend_Json_Server</classname> escucha por solicitudes POST
        únicamente en este momento; afortunadamente, la mayoría de las
        implementaciones del cliente JSON-RPC en los medios en el momento de
        escribir esto, sólo requieren a POST como es. Esto hace que sea fácil de
        utilizar el mismo punto final del servidor para manejar a ambas
        peticiones así como para entregar el servicio SMD, como se muestra en el
        siguiente ejemplo. </para>

    <example id="zend.json.server.usage">
        <title>Uso de Zend_Json_Server</title>

        <para>Primero, definir una clase que queramos exponer vía servidor
            JSON-RPC. Vamos a la clase 'Calculator', y definir los métodos para
            'add', 'subtract', 'multiply', y 'divide':</para>

        <programlisting language="php"><![CDATA[
/**
 * Calculator - clase de ejemplo para exponer via JSON-RPC
 */
class Calculator
{
    /**
     * Devuelve la suma de dos variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function add($x, $y)
    {
        return $x + $y;
    }

    /**
     * Devuelve la diferencia de dos variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function subtract($x, $y)
    {
        return $x - $y;
    }

    /**
     * Devuelve el producto de dos variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function multiply($x, $y)
    {
        return $x * $y;
    }

    /**
     * Devuelve la división de dos variables
     *
     * @param  int $x
     * @param  int $y
     * @return float
     */
    public function divide($x, $y)
    {
        return $x / $y;
    }
}
]]></programlisting>

        <para> Nótese que cada método tiene un docblock con entradas indicando
            cada parámetro y su tipo, así como una entrada para el valor de
            retorno. Esto es <emphasis>absolutamente crítico</emphasis> cuando
            se usa <classname>Zend_Json_Server</classname> -- o cualquier otro
            componente del servidor en Zend Framework, por esa cuestión. </para>

        <para>Ahora, crearemos un script para manejar las peticiones:</para>

        <programlisting language="php"><![CDATA[
$server = new Zend_Json_Server();

// Indicar que funcionalidad está disponible:
$server->setClass('Calculator');

// Manejar el requerimiento:
$server->handle();
]]></programlisting>

        <para> Sin embargo, esto no soluciona el problema de devolución de un
            SMD para que el cliente JSON-RPC pueda autodescubrir los métodos.
            Esto puede lograrse determinando el método del requerimiento
                <acronym>HTTP</acronym> , y luego especificando algún servidor
            de metadatos: </para>

        <programlisting language="php"><![CDATA[
$server = new Zend_Json_Server();
$server->setClass('Calculator');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Indica el punto final de la URL, y la versión en uso de JSON-RPC:
    $server->setTarget('/json-rpc.php')
           ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);

    // Capturar el SMD
    $smd = $server->getServiceMap();

    // Devolver el SMD al cliente
    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server->handle();
]]></programlisting>

        <para>Si utiliza el servidor JSON-RPC con Dojo toolkit, también
            necesitará establecer un flag de compatibilidad especial para
            garantizar que los dos interoperen correctamente:</para>

        <programlisting language="php"><![CDATA[
$server = new Zend_Json_Server();
$server->setClass('Calculator');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    $server->setTarget('/json-rpc.php')
           ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
    $smd = $server->getServiceMap();

    // Establecer la compatibilidad con Dojo:
    $smd->setDojoCompatible(true);

    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server->handle();
]]></programlisting>
    </example>

    <sect2 id="zend.json.server.details">
        <title>Detalles Avanzados</title>

        <para> Aunque la mayor funcionalidad de
                <classname>Zend_Json_Server</classname> se puntualiza en <xref
                linkend="zend.json.server.usage"/> , hay más funcionalidad
            avanzada disponible. </para>

        <sect3 id="zend.json.server.details.zendjsonserver">
            <title>Zend_Json_Server</title>

            <para>
                <classname>Zend_Json_Server</classname> es la clase núcleo en la
                propuesta JSON-RPC; que maneja todas las peticiones y como
                respuesta devuelve un conjunto de datos. Tiene los siguientes
                métodos: </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>addFunction($function)</methodname> :
                        Especifica la función de espacio del usuario para
                        agregar al servidor. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setClass($class)</methodname> : Especifica
                        una clase u objeto para agregar al servidor; todos los
                        métodos públicos de ese item serán expuestos como
                        métodos JSON-RPC. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>fault($fault = null, $code = 404, $data =
                            null)</methodname> : Crea y devuelve un objeto
                            <classname>Zend_Json_Server_Error</classname> .
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>handle($request = false)</methodname> :
                        Maneja una solicitud JSON-RPC; opcionalmente, pasa un
                        objeto <classname>Zend_Json_Server_Request</classname> a
                        utlizar (crea uno por defecto). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getFunctions()</methodname> : Devuelve una
                        lista de todos los métodos agregados. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setRequest(Zend_Json_Server_Request
                            $request)</methodname> : Especifica un objeto
                        solicitud para el servidor a utilizar. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getRequest()</methodname> : Recupera el
                        objeto solicitud usado por el servidor. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setResponse(Zend_Json_Server_Response
                            $response)</methodname> : Establece el objeto
                        respuesta para el servidor a utilizar. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getResponse()</methodname> : Recupera el
                        objeto respuesta usado por el servidor. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setAutoEmitResponse($flag)</methodname> :
                        Indica si el servidor debería emitir automáticamente la
                        respuesta y todas las cabeceras; por defecto, esto es
                        <constant>TRUE</constant>. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>autoEmitResponse()</methodname> : Determina
                        si la auto-emisión de la respuesta está habilitada.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getServiceMap()</methodname> : Recupera la
                        descripción del mapa de servicio en el form de un objeto
                            <classname>Zend_Json_Server_Smd</classname> .
                    </para>
                </listitem>
            </itemizedlist>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonserverrequest">
            <title>Zend_Json_Server_Request</title>

            <para> El medio ambiente de una solicitud JSON-RPC está encapsulado
                en el objeto <classname>Zend_Json_Server_Request</classname> .
                Este objeto le permite establecer porciones necesarias de la
                solicitud JSON-RPC, incluida el ID de la solicitud, parámetros y
                especificaciones de la versión JSON-RPC. Tiene la capacidad de
                cargarse a sí mismo via JSON o un conjunto de opciones, y puede
                mostrase a si mismo como JSON vía el método
                    <methodname>toJson()</methodname> . </para>

            <para>El objeto solicitud tiene los siguientes métodos
                disponibles:</para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setOptions(array $options)</methodname> :
                        Especifica la configuración del objeto.
                            <varname>$options</varname> puede contener claves
                        que concuerden con cualuier método 'set':
                            <methodname>setParams()</methodname> ,
                            <methodname>setMethod()</methodname> ,
                            <methodname>setId()</methodname> , y
                            <methodname>setVersion()</methodname> . </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>addParam($value, $key = null)</methodname> :
                        Agrega un parámetro para usar con el método de llamada.
                        Los parámetros pueden ser sólo los valores, o pueden
                        incluir opcionalmente el nombre del parámetro. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>addParams(array $params)</methodname> :
                        Agrega múltiples parámetros a la vez; proxies a
                            <methodname>addParam()</methodname>
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setParams(array $params)</methodname> :
                        Establece todos los parámetros a la vez; sobrescribe
                        cualquiera de los parámetros existentes. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getParam($index)</methodname> : Recupera un
                        parámetro por posición o por el nombre. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getParams()</methodname> : Recupera todos
                        los parámetros a la vez. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setMethod($name)</methodname> : Establece el
                        método para llamar. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getMethod()</methodname> : Recupera el
                        método que será llamado. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>isMethodError()</methodname> : Determinar si
                        la solicitud está malformada o no y si daría como
                        resultado un error. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setId($name)</methodname> : Establecer el
                        identificador de solicitud(utilizado por el cliente para
                        igualar las solicitudes de respuestas). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getId()</methodname> : Recuperar el
                        identificador de solicitudes. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setVersion($version)</methodname> :
                        Establecer la versión de la especificación JSON-RPC que
                        conforma la solicitud. Puede ser '1.0' o '2.0'. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getVersion()</methodname> : Recuperar la
                        versión de la especificación JSON-RPC utilizados por la
                        solicitud. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>loadJson($json)</methodname> : Cargar el
                        objeto solicitud de una cadena JSON. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toJson()</methodname> : Mostrar la solicitud
                        como un string JSON. </para>
                </listitem>
            </itemizedlist>

            <para> Una versión específica de <acronym>HTTP</acronym> está
                disponible a través de
                    <classname>Zend_Json_Server_Request_Http</classname> . Esta
                clase podrá recuperar la solicitud via
                    <methodname>php://input</methodname> , y permite el acceso
                JSON sin procesar vía el método
                    <methodname>getRawJson()</methodname> . </para>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonserverresponse">
            <title>Zend_Json_Server_Response</title>

            <para> La respuesta del conjunto de datos JSON-RPC es encapsulada en
                el objeto <classname>Zend_Json_Server_Response</classname> .
                Este objeto le permite ajustar el valor de retorno de la
                solicitud, siendo la respuesta un error o no, el identificador
                de solicitud, con que versión de especificación esta conformada
                la respuesta de JSON-RPC, y, opcionalmente el mapa de servicio. </para>

            <para>El objeto respuesta tiene los siguientes métodos
                disponibles:</para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setResult($value)</methodname> : Establecer
                        el resultado de la respuesta. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getResult()</methodname> : Recuperar el
                        resultado de la respuesta. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setError(Zend_Json_Server_Error
                            $error)</methodname> : Establecer un objeto error.
                        Si ya está, este será utilizado como la respuesta cuando
                        se serialize a JSON. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getError()</methodname> : Recuperar el
                        objeto error, si lo hubiera. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>isError()</methodname> : Si la respuesta es
                        una respuesta de error o no. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setId($name)</methodname> : Establecer el
                        identificador de solicitud (de manera que la respuesta
                        del cliente pueda coincidir con la solicitud original).
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getId()</methodname> : Recuperar el
                        identificador de solicitud. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setVersion($version)</methodname> :
                        Establecer la versión JSON-RPC con la que deba estar
                        conformada la respuesta. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getVersion()</methodname> : Recuperar la
                        versión JSON-RPC con la cumple la respuesta. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toJson()</methodname> : Serializar la
                        respuesta a JSON. Si la respuesta es una respuesta de
                        error, serializar el objeto error. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setServiceMap($serviceMap)</methodname> :
                        Establecer el objeto mapa de servicio para la respuesta.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getServiceMap()</methodname> : Recuperar el
                        objeto mapa de servicio, si hubiera alguno. </para>
                </listitem>
            </itemizedlist>

            <para> Una versión específica de <acronym>HTTP</acronym> está
                disponible a través de
                    <classname>Zend_Json_Server_Response_Http</classname> . Esta
                clase enviará las cabeceras <acronym>HTTP</acronym> apropiadas
                así como serializará la respuesta como <acronym>JSON</acronym> .
            </para>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonservererror">
            <title>Zend_Json_Server_Error</title>

            <para>JSON-RPC tiene un formato especial para informar condiciones
                de error. Todos los errores necesitan proporcionar, mínimamente,
                un mensaje de error y un código de error; opcionalmente, pueden
                proporcionar datos adicionales, tales como un backtrace.</para>

            <para> Los códigos de error derivan de los recomendados por <ulink
                    url="http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php"
                    >el proyecto XML-RPC EPI</ulink> .
                    <classname>Zend_Json_Server</classname> apropiadamente
                asigna el código sobre la base de la condición de error. Para
                las excepciones de la aplicación, se utiliza el código '-32000'. </para>

            <para>
                <classname>Zend_Json_Server_Error</classname> expone los
                siguientes métodos: </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setCode($code)</methodname> : Establece el
                        código de error; si el código de error no está en el
                        rango de aceptación de XML-RPC, -32000 será asignado.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getCode()</methodname> : Recuperar el actual
                        código de error. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setMessage($message)</methodname> :
                        Establecer el mensaje de error. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getMessage()</methodname> : Recuperar el
                        mensaje de error actual. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setData($data)</methodname> : Establecer el
                        conjunto de datos auxiliares para calificar más adelante
                        el error, tal como un backtrace. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getData()</methodname> : Recuperar cualquier
                        auxiliar actual de errores de datos. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toArray()</methodname> : Mandar el error a
                        un array. El array contendrá las claves 'code',
                        'message', y 'data'. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toJson()</methodname> : Mandar el error a
                        una representación de error JSON-RPC. </para>
                </listitem>
            </itemizedlist>
        </sect3>

        <sect3 id="zend.json.server.details.zendjsonserversmd">
            <title>Zend_Json_Server_Smd</title>

            <para> SMD quiere decir Service Mapping Description, un esquema JSON
                que define cómo un cliente puede interactuar con un servicio web
                en particular. En el momento de escribir esto, la <ulink
                    url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal"
                    >especificación</ulink> todavía no ha sido ratificada
                oficialmente, pero ya está en uso en Dojo toolkit así como en
                otros clientes consumidores de JSON-RPC. </para>

            <para> En su aspecto más básico, un SMD indica el método de
                transporte (POST, GET, TCP/IP, etc), el tipo de envoltura de la
                solicitud (generalmente se basa en el protocolo del servidor),
                el objetivo <acronym>URL</acronym> del proveedor del servicio, y
                un mapa de los servicios disponibles. En el caso de JSON-RPC, el
                servicio de mapa es una lista de los métodos disponibles, en el
                que cada método documenta los parámetros disponibles y sus
                tipos, así como los tipos de valores esperados a devolver. </para>

            <para>
                <classname>Zend_Json_Server_Smd</classname> Proporciona un
                objeto orientado para construir servicios de mapas. Básicamente,
                pasa los metadatos describiendo el servicio usando mutators, y
                especifica los servicios (métodos y funciones). </para>

            <para> Las descripciones de los servicios son típicamente instancias
                de <classname>Zend_Json_Server_Smd_Service</classname> ; también
                puede pasar toda la información como un array a los diversos
                mutators de servicios en
                    <classname>Zend_Json_Server_Smd</classname> , y que
                instanciará on objeto de servicio por usted. Los objetos de
                servicio contienen información como el nombre del servicio
                (típicamente, la función o el nombre del método), los parámetros
                (nombres, tipos y posición), y el tipo del valor de retorno.
                Opcionalmente, cada servicio puede tener su propio objetivo y
                envoltura, aunque esta funcionalidad rara vez es utilizada. </para>

            <para>
                <classname>Zend_Json_Server</classname> Realmente todo esto
                sucede entre bambalinas para usted, utilizando reflexión sobre
                las clases y funciones agregadas; debe crear su propio servicio
                de mapas sólo si necesita brindar funcionalidad personalizada
                que la introspección de clase y función no puede ofrecer. </para>

            <para> Los métodos disponibles en
                    <classname>Zend_Json_Server_Smd</classname> incluyen: </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setOptions(array $options)</methodname> :
                        Establecer un objeto SMD desde un array de opciones.
                        Todos los mutators (métodos comenzando con 'set') se
                        pueden usar como claves. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setTransport($transport)</methodname> :
                        Establecer el transporte usado para acceder al servicio;
                        únicamente POST es actualmente soportado. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getTransport()</methodname> : Obtener el
                        servicio de transporte actual. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setEnvelope($envelopeType)</methodname> :
                        Establecer la envoltura de la solicitud que debería ser
                        utilizada para acceder al servicio. Actualmente las
                        constantes soportadas son
                            <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant>
                        y
                            <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant>
                        . </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getEnvelope()</methodname> : Obtener la
                        envoltura de la petición actual. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setContentType($type)</methodname> :
                        Establecer el tipo de contenido que deben utilizar las
                        solicitudes (por defecto, es 'application/json»).
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getContentType()</methodname> : Conseguir el
                        tipo del contenido actual para las solicitudes al
                        servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setTarget($target)</methodname> : Establecer
                        el punto final de la <acronym>URL</acronym> para el
                        servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getTarget()</methodname> : Obtener el punto
                        final de la <acronym>URL</acronym> para el servicio.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setId($id)</methodname> : Normalmente, este
                        es el punto final de la <acronym>URL</acronym> del
                        servicio (igual que el objetivo). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getId()</methodname> : Recuperar el ID del
                        servicio (normalmente el punto final de la
                            <acronym>URL</acronym> del servicio). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setDescription($description)</methodname> :
                        Establecer una descripción del servicio (típicamente
                        información narrativa que describe el propósito del
                        servicio). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getDescription()</methodname> : Obtener la
                        descripción del servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setDojoCompatible($flag)</methodname> :
                        Establecer un flag que indique si el SMD es compatible o
                        no con el toolkit de Dojo. Cuando sea verdadero, el
                            <acronym>JSON</acronym> SMD será formateado para
                        cumplir con el formato que espera el cliente de Dojo
                        JSON-RPC. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>isDojoCompatible()</methodname> : Devuelve
                        el valor del flag de compatibilidad de Dojo (<constant>FALSE</constant>, por
                        defecto). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>addService($service)</methodname> : Añade un
                        servicio al mapa. Puede ser un array de información a
                        pasar al constructor de
                            <classname>Zend_Json_Server_Smd_Service</classname>
                        , o una instancia de esa clase. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>addServices(array $services)</methodname> :
                        Agrega múltiples servicios a la vez. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setServices(array $services)</methodname> :
                        Agrega múltiples servicios a la vez, sobreescribiendo
                        cualquiera de los servicios previamente establecidos.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getService($name)</methodname> : Ontiene el
                        servicio por su nombre. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getServices()</methodname> : Obtener todos
                        los servicios agregados. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>removeService($name)</methodname> : Elimina
                        un servicio del mapa. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toArray()</methodname> : Mandar el mapa de
                        servicio a un array. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toDojoArray()</methodname> : Mandar el mapa
                        de servicio a un array compatible con Dojo Toolkit.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toJson()</methodname> : Mandar el mapa de
                        servicio a una representación JSON. </para>
                </listitem>
            </itemizedlist>

            <para>
                <classname>Zend_Json_Server_Smd_Service</classname> tiene los
                siguientes métodos: </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <methodname>setOptions(array $options)</methodname> :
                        Establecer el estado del objeto dede un array. Cualquier
                        mutator (métodos comenzando con 'set') puede ser
                        utilizado como una clave y establecerlo mediante este
                        método. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setName($name)</methodname> : Establecer el
                        nombre del servicio (típicamente, la función o el nombre
                        del método). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getName()</methodname> : Recuperar el nombre
                        del servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setTransport($transport)</methodname> :
                        Establecer el servicio de transporte (actualmente, sólo
                        transportes apoyados por
                            <classname>Zend_Json_Server_Smd</classname> son
                        permitidos). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getTransport()</methodname> : Recuperar el
                        transporte actual. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setTarget($target)</methodname> : Establecer
                        el punto final de la <acronym>URL</acronym> del servicio
                        (típicamente, este será el mismo que el SMD en general,
                        al cual el servicio está agregado). </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getTarget()</methodname> : Obtener el punto
                        final de la <acronym>URL</acronym> del servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setEnvelope($envelopeType)</methodname> :
                        Establecer la envoltura del servicio (actualmente, sólo
                        se permiten las envolturas soportadas por
                            <classname>Zend_Json_Server_Smd</classname> .
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getEnvelope()</methodname> : Recuperar el
                        tipo de envoltura del servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>addParam($type, array $options = array(),
                            $order = null)</methodname> : Añadir un parámetro
                        para el servicio. Por defecto, sólo el tipo de parámetro
                        es necesario. Sin embargo, también puede especificar el
                        orden, así como opciones tales como: </para>
                    <itemizedlist>
                        <listitem>
                            <para>
                                <emphasis>name</emphasis> : el nombre del
                                parámetro </para>
                        </listitem>
                        <listitem>
                            <para>
                                <emphasis>optional</emphasis> : cuándo el
                                parámetro es opcional o no </para>
                        </listitem>
                        <listitem>
                            <para>
                                <emphasis>default</emphasis> : un valor por
                                defecto para el parámetro </para>
                        </listitem>
                        <listitem>
                            <para>
                                <emphasis>description</emphasis> : texto
                                describiendo el parámetro </para>
                        </listitem>
                    </itemizedlist>
                </listitem>
                <listitem>
                    <para>
                        <methodname>addParams(array $params)</methodname> :
                        Agregar varios parámetros a la vez; cada param debería
                        ser un array asociativo conteniendo mínimamente la clave
                        'type' describiendo el tipo de parámetro y,
                        opcionalmente la clave 'order'; cualquiera de las otras
                        claves serán pasados como <varname>$options</varname> a
                            <methodname>addOption()</methodname> . </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setParams(array $params)</methodname> :
                        Establecer muchos parámetros a la vez, sobrescribiendo
                        cualquiera de los parámetros existentes. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getParams()</methodname> : Recuperar todos
                        los parámetros actualmente establecidos. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>setReturn($type)</methodname> : Establecer
                        el tipo del valor de retorno del servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>getReturn()</methodname> : Obtener el tipo
                        del valor de retorno del servicio. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toArray()</methodname> : Mandar el servicio
                        a un array. </para>
                </listitem>
                <listitem>
                    <para>
                        <methodname>toJson()</methodname> : Mandar el servicio a
                        una representación <acronym>JSON</acronym> . </para>
                </listitem>
            </itemizedlist>
        </sect3>
    </sect2>
</sect1>
