Я не понимаю, почему я получаю пустой объект 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) {}
Почему это? Может кто-нибудь объяснить?
UPDATE: добавлен 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>
заранее спасибо
кельвин
Я нашел причину, по которой он не работал. Мне пришлось отключить кэширование в конфиге и добавить параметр, чтобы не кэшировать в запросе, который я сделал.
Либо отключите кеширование с помощью ini_set, либо внесите изменения в ваш php.ini:
ini_set("soap.wsdl_cache_enabled", 0);
Я также добавил к моему запросу следующий параметр параметра:
array('cache_wsdl' => WSDL_CACHE_NONE)
Вот статья, которую я нашел в Stackoverflow: на PHP, как вы можете очистить кеш WSDL?
Кажется, что в этой статье обсуждалась одна и та же проблема:
Возвращаемый объект с Zend_Soap
Образец цитирования:
Вам нужно передать переменную параметра «classmap» в клиенте. См. Также http://www.php.net/manual/en/soapclient.soapclient.php и http://www.php.net/manual/en/soapclient.soapclient.php о параметре «classmap», который был передан в массив параметров. В основном это должен быть массив, сопоставляющий ваши классы с классами, определенными как возвращаемые объекты в файле WSDL.
Lucian