Formatting PHP Soap Server responses

I am making a SOAP web service in PHP that must meet the requirements of a client XSD file.

Here is the link to the XSD file provided by the client: http://pastebin.com/MX1BZUXc

The expected answer is as follows:

[Some long lines are broken down into legibility, into the theory that the problem is not related to spaces.]

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header /> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CheckVersionResponse xmlns="http://www.---.---/---"> <CheckversionResult> <ValidationOk>true</ValidationOk> <VersionNumber>1.4.0</VersionNumber> <CurrentRemoteServerTime >2014-05-02T09:35:20.368+02:00</CurrentRemoteServerTime> </CheckversionResult> </CheckVersionResponse> </s:Body> </s:Envelope> 

However, the answer I am getting now is as follows:

 <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://---.---/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2003/05/soap-encoding"> <env:Body xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"> <ns1:CheckVersionResponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <rpc:result>return</rpc:result> <return xsi:type="enc:Struct"> <ValidationOk xsi:type="xsd:int">1</ValidationOk> <VersionNumber xsi:type="xsd:string" >1.4.0</VersionNumber> <CurrentRemoteServerTime xsi:type="xsd:string" >2014-05-08T10:31:49</CurrentRemoteServerTime> </return> </ns1:CheckVersionResponse> </env:Body> </env:Envelope> 

Here's how I made my SOAP web service:

 <?php /* Helper class for my response object */ class CheckVersionResult extends stdClass { /** @var bool */ public $ValidationOk = ''; /** @var string */ public $VersionNumber = ''; /** @var string */ public $CurrentRemoteServerTime = ''; } /* SOAP interface class */ class MySoapClass { /** * Returns version * * @param string $param1 * @param string $param2 * @return CheckVersionResult */ public function CheckVersion($param1, $param2) { $data = new CheckVersionResult(); $data->ValidationOk = 1; $data->VersionNumber = '1.4.0'; $data->CurrentRemoteServerTime = date('Ymd\TH:i:s'); } } /* Controller class */ class WebserviceController { public function indexAction() { $soap = new Zend_Soap_Server(); $soap->setClass('MySoapClass'); $soap->setUri("http://---.---/"); $mySoapClass = new MySoapClass(); $soap->setObject($mySoapClass); $soap->setSoapVersion(SOAP_1_2); $soap->handle(); } } 

And here is what I call my web service:

 $client = new SoapClient(null, array( "soap_version" => SOAP_1_2, "location" => "http://---.---/webservice/index", "uri" => "http://---.---/", "trace" => 1, // enable trace to view what is happening "exceptions" => 0, // disable exceptions "cache_wsdl" => 0) // no wsdl ); $client->CheckVersion('param1', 'param2'); header('Content-Type: application/xml; charset=utf-8'); echo $client->__getLastResponse(); die(); 

Does anyone know how I can properly format my SOAP response according to the XSD file I received?

+6
source share
1 answer

You must create the correct wsdl file. Your server is currently running in rpc style by default. Try using http://framework.zend.com/manual/1.12/en/zend.soap.autodiscovery.html with various WSDL binding styles.

Something like that:

server.php:

 <?php error_reporting(E_ALL); ini_set('display_errors', 1); set_include_path(get_include_path().';./library/;./library/Zend'); require_once 'Zend/Loader/Autoloader.php'; $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->setFallbackAutoloader(true); /* Helper class for my response object */ class CheckVersionResult extends stdClass { /** @var bool */ public $ValidationOk = ''; /** @var string */ public $VersionNumber = ''; /** @var string */ public $CurrentRemoteServerTime = ''; } /* SOAP interface class */ class MySoapClass { /** * Returns version * * @param string $param1 * @param string $param2 * @return CheckVersionResult */ public function CheckVersion($param1, $param2) { $data = new CheckVersionResult(); $data->ValidationOk = 1; $data->VersionNumber = '1.4.0'; $data->CurrentRemoteServerTime = date('Ymd\TH:i:s'); return $data; } } $mySoapClass = new MySoapClass(); if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(); $autodiscover->setClass('MySoapClass'); $autodiscover->setOperationBodyStyle( array('use' => 'literal', 'namespace' => 'http://localhost/stack/23537231/server.php') ); $autodiscover->setBindingStyle( array('style' => 'document', 'transport' => 'http://localhost/stack/23537231/server.php') ); $autodiscover->handle(); } else { // pointing to the current file here $soap = new Zend_Soap_Server("http://localhost/stack/23537231/server.php?wsdl", array( 'cache_wsdl'=> WSDL_CACHE_NONE, 'classmap' => array( 'CheckVersionResult'=>'CheckVersionResult', ) )); $soap->setClass('MySoapClass'); $soap->handle(); } 

client.php

 <?php error_reporting(E_ALL); ini_set('display_errors', 1); set_include_path(get_include_path().';./library/;./library/Zend'); require_once 'Zend/Loader/Autoloader.php'; $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->setFallbackAutoloader(true); /* Helper class for my response object */ class CheckVersionResult extends stdClass { /** @var bool */ public $ValidationOk = ''; /** @var string */ public $VersionNumber = ''; /** @var string */ public $CurrentRemoteServerTime = ''; } $client = new SoapClient('http://localhost/stack/23537231/server.php?wsdl', array( "trace" => 1, // enable trace to view what is happening "exceptions" => 1, // disable exceptions "cache_wsdl" => WSDL_CACHE_NONE, 'classmap' => array( 'CheckVersionResult'=>'CheckVersionResult', )) // no wsdl ); $ret = $client->CheckVersion('param1', 'param2'); header('Content-Type: application/xml; charset=utf-8'); echo $client->__getLastResponse(); die(); 

With this, I have this:

 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:CheckVersionResponse> <return xsi:type="ns1:CheckVersionResult"> <ValidationOk xsi:type="xsd:boolean">true</ValidationOk> <VersionNumber xsi:type="xsd:string">1.4.0</VersionNumber> <CurrentRemoteServerTime xsi:type="xsd:string">2014-05-19T22:22:59</CurrentRemoteServerTime> </return> </ns1:CheckVersionResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

Side Note: I think your answer is a valid soap answer. Therefore, if the client is a real soap client, he should be able to analyze the answer and use it.

+1
source

All Articles