Search code examples
web-servicessoapwsdl

Only "hello" function working in my WSDL


Setting up a webservice on my Symfony server, I follow this guide: https://symfony.com/doc/current/controller/soap_web_service.html Example given is working well, with this hello fonction:

public function hello($name)
{
    return 'Hello, '.$name;
}

So I've tried to complete this webservice with this bye function:

public function bye($name)
{
    return 'Goodbye, '.$name;
}

And here is my wsdl:

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:tns="urn:arnleadservicewsdl"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:helloservicewsdl">

    <types>
        <xsd:schema targetNamespace="urn:hellowsdl">
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
            <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
        </xsd:schema>
    </types>

    <message name="helloRequest">
        <part name="name" type="xsd:string" />
    </message>

    <message name="helloResponse">
        <part name="return" type="xsd:string" />
    </message>

    <message name="byeRequest">
        <part name="name" type="xsd:string" />
    </message>

    <message name="byeResponse">
        <part name="return" type="xsd:string" />
    </message>

    <portType name="hellowsdlPortType">
        <operation name="hello">
            <documentation>Hello World</documentation>
            <input message="tns:helloRequest"/>
            <output message="tns:helloResponse"/>
        </operation>

        <operation name="bye">
            <documentation>Goodbye World</documentation>
            <input message="tns:byeRequest"/>
            <output message="tns:byeResponse"/>
        </operation>
    </portType>

    <binding name="hellowsdlBinding" type="tns:hellowsdlPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="hello">
            <soap:operation soapAction="urn:arnleadservicewsdl#hello" style="rpc"/>

            <input>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>

            <output>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
        <operation name="bye">
            <soap:operation soapAction="urn:arnleadservicewsdl#bye" style="rpc"/>

            <input>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>

            <output>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
    </binding>

    <service name="hellowsdl">
        <port name="hellowsdlPort" binding="tns:hellowsdlBinding">
            <soap:address location="http://10.0.0.42/esi/soap" />
        </port>
    </service>
</definitions>

Hello function is still working, but each time i call bye function, I get an error:

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML

Where am I wrong?


Solution

  • Ok, first I have rewritten my WSDL with help of https://www.wsdl-analyzer.com/. Here is my new WSDL:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions name="helloServiceController"
                 targetNamespace="urn:helloServiceControllerwsdl"
                 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
                 xmlns:tns="urn:helloServiceControllerwsdl">
        <wsdl:types>
            <xsd:schema targetNamespace="urn:helloServiceControllerwsdl">
                <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
                <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
            </xsd:schema>
        </wsdl:types>
        <wsdl:message name="helloRequest">
            <wsdl:part name="name" type="xsd:string"/>
        </wsdl:message>
        <wsdl:message name="helloResponse">
            <wsdl:part name="return" type="xsd:string"/>
        </wsdl:message>
        <wsdl:message name="byeRequest">
            <wsdl:part name="name" type="xsd:string"/>
        </wsdl:message>
        <wsdl:message name="byeResponse">
            <wsdl:part name="return" type="xsd:string"/>
        </wsdl:message>
        <wsdl:portType name="helloServicePortType">
            <wsdl:operation name="hello">
                <wsdl:documentation>Hello World</wsdl:documentation>
                <wsdl:input message="tns:helloRequest"/>
                <wsdl:output message="tns:helloResponse"/>
            </wsdl:operation>
            <wsdl:operation name="bye">
                <wsdl:documentation>Bye World</wsdl:documentation>
                <wsdl:input message="tns:byeRequest"/>
                <wsdl:output message="tns:byeResponse"/>
            </wsdl:operation>
        </wsdl:portType>
        <wsdl:binding name="helloServiceBinding" type="tns:helloServicePortType">
            <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="hello">
                <soap:operation soapAction="urn:helloServiceControllerwsdl#hello" style="rpc"/>
                <wsdl:input>
                    <soap:body use="encoded" namespace="urn:helloServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="encoded" namespace="urn:helloServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
                </wsdl:output>
            </wsdl:operation>
            <wsdl:operation name="bye">
                <soap:operation soapAction="urn:helloServiceControllerwsdl#bye" style="rpc"/>
                <wsdl:input>
                    <soap:body use="encoded" namespace="urn:helloServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="encoded" namespace="urn:helloServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
                </wsdl:output>
            </wsdl:operation>
        </wsdl:binding>
        <wsdl:service name="helloService">
            <wsdl:port name="helloServicePort" binding="tns:helloServiceBinding">
                <soap:address location="http://10.0.0.42/esi/soap"/>
            </wsdl:port>
        </wsdl:service>
    </wsdl:definitions>
    

    After that, it was still not working and even hello function was not working. After pulling my hair for a while, I simply restarted my server and it was good. Probably a cache problem!