SOAP Client receiving empty stdclass

£可爱£侵袭症+ 提交于 2019-12-23 13:39:19

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!