Reputation: 25
I am trying to set a soap server in php. It seems to work fine without the WSDl. When I point the server to the wsdl it gives me the following error:
Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Could not find any usable binding services in WSDL.
I have searched the web for a possible solution but none of the answers helped.
Following my test wsdl:
<?xml version='1.0' encoding='UTF-8'?>
<definitions name="WSDLExample" targetNamespace="urn:WSDLExample" xmlns:typens="urn:WSDLExample" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="doHello">
<part name="yourName" type="xsd:string"></part>
</message>
<message name="doHelloResponse">
<part name="doHelloReturn" type="xsd:string"></part>
</message>
<message name="index"></message>
<message name="indexResponse">
<part name="indexReturn" type="xsd:boolean"></part>
</message>
<portType name="ApiPortType">
<operation name="doHello">
<documentation>Gives your name back</documentation>
<input message="typens:doHello"></input>
<output message="typens:doHelloResponse"></output>
</operation>
<operation name="index">
<documentation>This is awesome1</documentation>
<input message="typens:index"></input>
<output message="typens:indexResponse"></output>
</operation>
</portType>
<binding name="ApiBinding" type="typens:ApiPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
<operation name="doHello">
<soap:operation soapAction="urn:ApiAction"></soap:operation>
<input>
<soap:body namespace="urn:WSDLExample" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"></soap:body>
</input>
<output>
<soap:body namespace="urn:WSDLExample" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"></soap:body>
</output>
</operation>
<operation name="index">
<soap:operation soapAction="urn:ApiAction"></soap:operation>
<input>
<soap:body namespace="urn:WSDLExample" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"></soap:body>
</input>
<output>
<soap:body namespace="urn:WSDLExample" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"></soap:body>
</output>
</operation>
</binding>
<service name="WSDLExampleService">
<port name="ApiPort" binding="typens:ApiBinding">
<soap:address></soap:address>
</port>
</service>
</definitions>
Thank you!
Edit:
I have found that problem, it was the service that was set not correctly. Now the error is:
[WSDL] SOAP-ERROR: Parsing WSDL: No location associated with
I guess it is still something related to the service.
Here is the server code:
error_reporting(0);
require_once(APPPATH . "/libraries/wsdl/WSDLCreator.php"); //Path to the library
$test = new WSDLCreator("WSDLExample", "http://localhost/soapWrap/wsdl");
$test->setClassesGeneralURL("http://localhost/soapWrap");
$test->includeMethodsDocumentation(TRUE);
$test->addFile(APPPATH . "controllers/api.php");
$test->addURLToClass("api", 'http://localhost/soapWrap/');
$test->addURLToTypens("XMLCreator", "http://localhost/soapWrap");
$test->createWSDL();
$test->printWSDL(true); // print with headers
I have also updated the wsdl with the new one.
Thanks.
Upvotes: 0
Views: 2529
Reputation: 25
I have found the problem(s).
First of all, I am using CodeIgniter and a library I found on the web for generating the WSDL.
The problem was with the 'service' tag.
I had to use the methods:
"addURLToClass" and "addURLToTypens" to set it up.
But since that library is not meant to work with CI, I had to play a bit the code. The problem was in the WSDLCreator.php page, changing the passed class to be the CI controller and then using the class inside it. That's all.
This is the actual code:
$classLower = strtolower($class);
$url = isset($this->classesURLS[$class]) ? $this->classesURLS[$class] : $this->classesGeneralURL;
$port = new XMLCreator("port");
$port->setAttribute("name", $class."Port");
$port->setAttribute("binding", "typens:".$class."Binding");
$soap = new XMLCreator("soap:address");
isset($this->classesURLS[$classLower]) ? $soap->setAttribute("location", $this->classesURLS[$classLower]) : "";
$port->addChild($soap);
If you need more info about the code, let me know.
Thanks for the help! Andrea
Upvotes: 1