TigerZF
🌐Español

Capítulo 66. Zend_Soap

66.1. Zend_Soap_Server

La clase Zend_Soap_Server tiene como objetivo simplificar el desarrollo de la parte servidora de servicios web para los programadores de PHP.

Puede usarse en modo WSDL o no-WSDL, y utilizando clases o funciones para definir la API del servicio web.

Cuando el componente Zend_Soap_Server funciona en modo WSDL, utiliza un documento WSDL ya preparado para definir el comportamiento del objeto servidor y las opciones de la capa de transporte.

El documento WSDL puede generarse automáticamente con la funcionalidad proporcionada por el componente Zend_Soap_AutoDiscovery o puede construirse manualmente usando la clase Zend_Soap_Wsdl o cualquier otra herramienta de generación de XML.

Si se usa el modo no-WSDL, entonces todas las opciones del protocolo deben establecerse mediante el mecanismo de opciones.

66.1.1. Constructor de Zend_Soap_Server

El constructor de Zend_Soap_Server debe usarse de forma algo diferente para los modos WSDL y no-WSDL.

66.1.1.1. Constructor de Zend_Soap_Server para el modo WSDL

El constructor de Zend_Soap_Server admite dos parámetros opcionales cuando funciona en modo WSDL:

  1. $wsdl, que es una URI de un archivo WSDL [22].

  2. $options - opciones para crear el objeto servidor SOAP [23].

    Las siguientes opciones se reconocen en el modo WSDL:

    • 'soap_version' ('soapVersion') - versión de soap a usar (SOAP_1_1 o SOAP_1_2).

    • 'actor' - la URI del actor para el servidor.

    • 'classmap' ('classMap') que puede usarse para mapear algunos tipos WSDL a clases PHP.

      La opción debe ser un array con los tipos WSDL como claves y los nombres de las clases PHP como valores.

    • 'encoding' - codificación de caracteres interna (UTF-8 se usa siempre como codificación externa).

    • 'wsdl' que equivale a la llamada setWsdl($wsdlValue).

66.1.1.2. Constructor de Zend_Soap_Server para el modo no-WSDL

El primer parámetro del constructor debe establecerse en NULL si se planea usar la funcionalidad de Zend_Soap_Server en modo no-WSDL.

También hay que establecer la opción 'uri' en este caso (ver más abajo).

El segundo parámetro del constructor ($options) es un array con opciones para crear el objeto servidor SOAP [24].

Las siguientes opciones se reconocen en el modo no-WSDL:

  • 'soap_version' ('soapVersion') - versión de soap a usar (SOAP_1_1 o SOAP_1_2).

  • 'actor' - la URI del actor para el servidor.

  • 'classmap' ('classMap') que puede usarse para mapear algunos tipos WSDL a clases PHP.

    La opción debe ser un array con los tipos WSDL como claves y los nombres de las clases PHP como valores.

  • 'encoding' - codificación de caracteres interna (UTF-8 se usa siempre como codificación externa).

  • 'uri' (obligatorio) - espacio de nombres URI para el servidor SOAP.

66.1.2. Métodos para definir la API del servicio web

Hay dos formas de definir la API del servicio web cuando se quiere dar acceso al código PHP a través de SOAP.

La primera consiste en adjuntar una clase al objeto Zend_Soap_Server que debe describir completamente la API del servicio web:

...
class MyClass {
    /**
     * This method takes ...
     *
     * @param integer $inputParam
     * @return string
     */
    public function method1($inputParam) {
        ...
    }

    /**
     * This method takes ...
     *
     * @param integer $inputParam1
     * @param string  $inputParam2
     * @return float
     */
    public function method2($inputParam1, $inputParam2) {
        ...
    }

    ...
}
...
$server = new Zend_Soap_Server(null, $options);
// Bind Class to Soap Server
$server->setClass('MyClass');
// Bind already initialized object to Soap Server
$server->setObject(new MyClass());
...
$server->handle();
[Note] ¡Importante!

Debería describir completamente cada método usando el docblock del método si planea usar la funcionalidad de autodescubrimiento para preparar el WSDL correspondiente del servicio web.

El segundo método para definir la API del servicio web es usar un conjunto de funciones y los métodos addFunction() o loadFunctions():

...
/**
 * This function ...
 *
 * @param integer $inputParam
 * @return string
 */
function function1($inputParam) {
    ...
}

/**
 * This function ...
 *
 * @param integer $inputParam1
 * @param string  $inputParam2
 * @return float
 */
function function2($inputParam1, $inputParam2) {
    ...
}
...
$server = new Zend_Soap_Server(null, $options);
$server->addFunction('function1');
$server->addFunction('function2');
...
$server->handle();

66.1.3. Gestión de los objetos de petición y respuesta

[Note] Avanzado

Esta sección describe opciones avanzadas de procesamiento de peticiones/respuestas y puede omitirse.

El componente Zend_Soap_Server realiza el procesamiento de peticiones/respuestas automáticamente, pero permite interceptarlo y realizar cierto pre y post-procesamiento.

66.1.3.1. Procesamiento de peticiones

El método Zend_Soap_Server::handle() toma la petición del flujo de entrada estándar ('php://input'). Puede sobrescribirse ya sea proporcionando un parámetro opcional al método handle() o estableciendo la petición mediante el método setRequest():

...
$server = new Zend_Soap_Server(...);
...
// Set request using optional $request parameter
$server->handle($request);
...
// Set request using setRequest() method
$server->setRequest();
$server->handle();

El objeto de petición puede representarse usando cualquiera de los siguientes:

  • DOMDocument (convertido a XML)

  • DOMNode (se toma el documento propietario y se convierte a XML)

  • SimpleXMLElement (convertido a XML)

  • stdClass (se llama a __toString() y se verifica que sea XML válido)

  • string (se verifica que sea XML válido)

La última petición procesada puede recuperarse usando el método getLastRequest() como una cadena XML:

...
$server = new Zend_Soap_Server(...);
...
$server->handle();
$request = $server->getLastRequest();

66.1.3.2. Preprocesamiento de la respuesta

El método Zend_Soap_Server::handle() emite automáticamente la respuesta generada al flujo de salida. Esto puede bloquearse usando setReturnResponse() con TRUE o FALSE como parámetro [25]. En este caso, el método handle() devuelve la respuesta generada.

...
$server = new Zend_Soap_Server(...);
...
// Get a response as a return value of handle() method
// instead of emitting it to the standard output
$server->setReturnResponse(true);
...
$response = $server->handle();
...

La última respuesta también puede recuperarse mediante el método getLastResponse() para algún post-procesamiento:

...
$server = new Zend_Soap_Server(...);
...
$server->handle();
$response = $server->getLastResponse();
...


[22] Puede establecerse más tarde usando el método setWsdl($wsdl).

[23] Las opciones pueden establecerse más tarde usando el método setOptions($options).

[24] Las opciones pueden establecerse más tarde usando el método setOptions($options).

[25] El estado actual del indicador Return Response puede consultarse con el método setReturnResponse().