php - example - zend framework 2 web service soap
la respuesta del servidor zend soap establece el espacio de nombres personalizado ns1 (2)
Estoy usando Zend_Soap_Server (modo WSDL) para dar salida a una respuesta xml a las llamadas de los clientes. Sin embargo, quiero establecer un nombre personalizado para el espacio de nombres ns1 en la respuesta.
Noté que el espacio de nombres en la respuesta está configurado por defecto como: '' ns1: getDoubleResponse '' donde '' getDouble '' es el método del servidor que se está llamando.
Aquí está mi controlador y la configuración del servidor SOAP:
class TestController extends Zend_Controller_Action {
public function testAction() {
// diable laoyouts and renderers
$this->getHelper ( ''viewRenderer'' )->setNoRender ( true );
$server = new Zend_Soap_Server (''http://example.com/public/test/testwsdl'');
$server->setClass ( ''Application_Model_test'');
// register exceptions that generate SOAP faults
$server->registerFaultException(''Application_Model_soapException'');
// handle request
$server->handle ();
}
public function testwsdlAction() {
// diable laoyouts and renderers
$this->getHelper ( ''viewRenderer'' )->setNoRender ( true );
$wsdl = new Zend_Soap_AutoDiscover ();
$wsdl->setClass ( ''Application_Model_test'');
$wsdl->setUri (''http://example.com/public/test/test'');
// handle request
$wsdl->handle ();
}
}
Este es mi código de modelo:
class Application_Model_test
{
/**
* Returns the double of an integer value
* @param integer $int
* @return string
*/
public function getDouble($int)
{
$doc = new DOMDocument ( ''1.0'', ''utf-8'' );
$response = $doc->createElement("IntegerResult");
$val = $doc->createElement("Value");
$val->appendChild ($doc->createTextNode($int * 2));
$response->appendChild($val);
$doc->appendChild ($response);
$result = $doc->saveXML();
return $result;
}
}
Esta es la solicitud que veo, según la interfaz de usuario SOAP:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://example.com/public/test/test">
<soapenv:Header/>
<soapenv:Body>
<test:getDouble soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<int xsi:type="xsd:int" xs:type="type:int" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">3</int>
</test:getDouble>
</soapenv:Body>
</soapenv:Envelope>
Y esta es la respuesta asociada, según la interfaz de usuario de SOAP:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/public/test/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getDoubleResponse>
<return xsi:type="xsd:string"><?xml version="1.0" encoding="utf-8"?>
<IntegerResult><Value>6</Value></IntegerResult></return>
</ns1:getDoubleResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Solo quiero cambiar el <ns1:getDoubleResponse>
en la respuesta SOAP a algo como <ns1:TestResult>
¿Cómo puedo arreglar el espacio de nombres? No me importa arrojar la respuesta a través de DOM o Xpath. También estoy interesado en extender Zend_Soap_Server para personalizar la respuesta.
ACTUALIZAR:
He extendido Zend_Soap_Server con una clase, y ahora intenté enviar una respuesta personalizada a través del método handle ().
// TestController.php
//$server = new Zend_Soap_Server (''http://example.com/public/test/testwsdl'');
$server = new TestSoapServer (''http://example.com/public/test/testwsdl'');
Y esta es la clase que extiende Zend_Soap_Server y maneja la respuesta:
// TestController.php
class TestSoapServer extends Zend_Soap_Server
{
public function __construct($wsdl, $options = null)
{
return parent::__construct($wsdl, $options);
}
public function handle($request = null)
{
$result = parent::handle($request);
$result = str_replace("getDoubleResponse", "TestResult", $result);
return $result;
}
}
Pero ahora, cuando ejecuto la solicitud en la interfaz de usuario SOAP, veo una respuesta vacía. No sé lo que estoy haciendo mal.
Finalmente, decidí analizar manualmente la solicitud SOAP entrante en mi Controlador:
// TestController.php
class TestSoapServer extends Zend_Soap_Server
{
// Handle the request and generate suitable response
public function handle($request = null)
{
if (null === $request) {
$request = file_get_contents(''php://input'');
}
// Parse request, generate a static/dynamic response and return it.
// return parent::handle($request); // Actual response
// Custom response
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($request);
libxml_clear_errors();
$xml = $doc->saveXML($doc->documentElement);
$xml = simplexml_load_string($xml);
$int = $xml->body->envelope->body->getdouble->int;
$value = $int * 2;
$result = ''<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://example.com/public/test/test"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:TestResult>'';
$result .= ''<IntegerResult><Value>''.$value.''</Value></IntegerResult>'';
$result .= ''</ns1:TestResult>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>'';
return $result;
}
}
Tenía requisitos similares en mi implementación de jax ws. Y sorprendentemente me enteré,
Del mismo modo, no creo que Zend Framework te permita controlar el nombre del mensaje. Lea la especificación zend para confirmación.
La única opción que tiene es analizar la respuesta según su requisito después de recibir en el lado del cliente usando DOM o Xpath. No estoy familiarizado con Zend Framework así que no puedo darle código de trabajo en este momento.