我不明白为什么我得到一个空的stdclass对象。
以下是代码:
$client = new Zend_Soap_Client('http://urltocodethatgenerateswsdl?wsdl', $options);
$result = $client->sayHello(array( 'who' => 'Heidi'));
Zend_Debug::dump($client->getLastResponse());
Zend_Debug::dump($result);
这是我获得的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>
这是$ result
的转储object(stdClass)#23 (0) {}
为什么?有人可以解释一下吗?
更新:添加了WSDL(由Zend使用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>
提前致谢
开尔文
答案 0 :(得分:2)
我找到了它无法正常工作的原因。我不得不在配置中关闭缓存,并在我的请求中添加一个不缓存的选项。
使用ini_set禁用缓存,或者修改php.ini:
ini_set("soap.wsdl_cache_enabled", 0);
我还在我的请求中添加了以下选项参数:
array('cache_wsdl' => WSDL_CACHE_NONE)
这是我在Stackoverflow上发现的一篇文章: In PHP how can you clear a WSDL cache?
答案 1 :(得分:0)
似乎这篇文章讨论了同样的问题:
引用:
您需要在客户端中传递“classmap”选项变量。 有关在选项数组中传递的'classmap'选项,请参阅http://www.php.net/manual/en/soapclient.soapclient.php和http://www.php.net/manual/en/soapclient.soapclient.php。 基本上它应该是一个数组,将类映射到定义为WSDL文件中返回对象的类。
卢西恩