问题
I don't understand why I am getting an empty stdclass object.
Here's the code:
$client = new Zend_Soap_Client('http://urltocodethatgenerateswsdl?wsdl', $options);
$result = $client->sayHello(array( 'who' => 'Heidi'));
Zend_Debug::dump($client->getLastResponse());
Zend_Debug::dump($result);
Here's what I get for the lastResponse:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://urltocodethatgenerateswsdl">
<SOAP-ENV:Body>
<ns1:sayHelloResponse>
<return>Say Hello Heidi</return>
</ns1:sayHelloResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
And here is the dump of $result
object(stdClass)#23 (0) {}
Why is that? Can somebody explain?
UPDATE: Added WSDL (automatically generated by Zend using AutoDiscovery)
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://clxpreview.ch/index/soap" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="Service_Soap" targetNamespace="http://clxpreview.ch/index/soap">
<types>
<xsd:schema targetNamespace="http://urltocodethatgenerateswsdl">
<xsd:complexType name="User">
<xsd:all>
<xsd:element name="username" type="xsd:string" nillable="true"/>
<xsd:element name="password" type="xsd:string" nillable="true"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>
<portType name="Service_SoapPort">
<operation name="getSystemTime">
<documentation>getSystemTime</documentation>
<input message="tns:getSystemTimeIn"/>
<output message="tns:getSystemTimeOut"/>
</operation>
<operation name="sayHello">
<documentation>sayHello</documentation>
<input message="tns:sayHelloIn"/>
<output message="tns:sayHelloOut"/>
</operation>
<operation name="getUser">
<documentation>setUser</documentation>
<input message="tns:getUserIn"/>
<output message="tns:getUserOut"/>
</operation>
<operation name="setUser">
<documentation>setUser</documentation>
<input message="tns:setUserIn"/>
<output message="tns:setUserOut"/>
</operation>
</portType>
<binding name="Service_SoapBinding" type="tns:Service_SoapPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getSystemTime">
<soap:operation soapAction="http://urltocodethatgenerateswsdl#getSystemTime"/>
<input>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</input>
<output>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</output>
</operation>
<operation name="sayHello">
<soap:operation soapAction="http://urltocodethatgenerateswsdl#sayHello"/>
<input>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</input>
<output>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</output>
</operation>
<operation name="getUser">
<soap:operation soapAction="http://urltocodethatgenerateswsdl#getUser"/>
<input>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</input>
<output>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</output>
</operation>
<operation name="setUser">
<soap:operation soapAction="http://urltocodethatgenerateswsdl#setUser"/>
<input>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</input>
<output>
<soap:body use="literal" namespace="http://urltocodethatgenerateswsdl"/>
</output>
</operation>
</binding>
<service name="Service_SoapService">
<port name="Service_SoapPort" binding="tns:Service_SoapBinding">
<soap:address location="http://urltocodethatgenerateswsdl"/>
</port>
</service>
<message name="getSystemTimeIn"/>
<message name="getSystemTimeOut">
<part name="return" type="xsd:string"/>
</message>
<message name="sayHelloIn">
<part name="who" type="xsd:string"/>
</message>
<message name="sayHelloOut">
<part name="return" type="xsd:string"/>
</message>
<message name="getUserIn">
<part name="uid" type="xsd:int"/>
</message>
<message name="getUserOut">
<part name="return" type="tns:User"/>
</message>
<message name="setUserIn">
<part name="user" type="tns:User"/>
</message>
<message name="setUserOut">
<part name="return" type="xsd:string"/>
</message>
</definitions>
Thanks in advance
Kelvin
回答1:
I found the reason why it wasn't working. I had to turn off caching in the config and add an option to not cache in the request I made.
Either disable caching by using ini_set, or by making a modification to your php.ini:
ini_set("soap.wsdl_cache_enabled", 0);
I also added the following option parameter to my request:
array('cache_wsdl' => WSDL_CACHE_NONE)
Here's an article I found on Stackoverflow: In PHP how can you clear a WSDL cache?
回答2:
It seems like this post discussed the same problem:
Return object with Zend_Soap
Citation:
You need to pass a 'classmap' option variable in the client. See both http://www.php.net/manual/en/soapclient.soapclient.php and http://www.php.net/manual/en/soapclient.soapclient.php about the 'classmap' option passed in the option array. Basically it should be an array mapping your classes to the classes defined as the returned objects in the WSDL file.
Lucian
来源:https://stackoverflow.com/questions/10450438/soap-client-receiving-empty-stdclass