Jump to content

Strange problem with SOAP.Only first declareted operation in bindings works fine


butterflydaniel

Recommended Posts

I have strange problem with SOAP. My file SchoolAPI look like that:

 

<?php
require_once('../require/constants.php');
require_once('../require/connection.inc.php');

class SchoolAPI{
private $dbh;

   	public function __construct()
    {
	 	$this->dbh = new PDO(DRIVER.':host='.HOST.';dbname='.DB, USER, PASSWORD);
  	}
  	
//function return all subcjects
public function getSubjects(){
	$sth = $this->dbh->prepare('  SELECT id, nazwa ROM subjects');
	$sth->execute(); 

		return $sth->fetchAll(PDO::FETCH_NUM); 	
	//return array(array("1", "subject1"),array("2", "subject2"));
}

//function return all classes
public function getClasses(){
	$sth = $this->dbh->prepare('  SELECT id, nazwa FROM classes');
	$sth->execute();  
		return $sth->fetchAll(PDO::FETCH_NUM);	
	//return array(array("1", "class1"),array("2", "class2"));
}
  
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("SchoolAPI.wsdl");
$server->setClass("SchoolAPI");
$server->handle();
?>

 

wsdl file is named SchoolAPI.wsdl and look like that:

 

<wsdl:definitions  
xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:tns="http://schema.example.com" 
targetNamespace="http://schema.example.com" >
  
  <wsdl:types>
  	<xsd:schema targetNamespace="http://schema.example.com">
	<xsd:complexType name="myarry2">
		<xsd:sequence>
			<xsd:element minOccurs="0" maxOccurs="unbounded" name="row" nillable="true" type="xsd:string" /> 
		</xsd:sequence>
	</xsd:complexType>
</xsd:schema>
    <xsd:schema targetNamespace="http://schema.example.com">
	<xsd:complexType name="myarray">
		<xsd:sequence>
			<xsd:element minOccurs="0" maxOccurs="unbounded" name="table" nillable="true" type="tns:myarry2" /> 
		</xsd:sequence>
	</xsd:complexType>
</xsd:schema>
  </wsdl:types>

  <wsdl:message name="getSubjectsRequest"></wsdl:message>
  <wsdl:message name="getSubjectsResponse">
    <part name="getSubjectsReturn" type="tns:myarray"/>
  </wsdl:message>

  <wsdl:message name="getClassesRequest"></wsdl:message>
  <wsdl:message name="getClassesResponse">
    <part name="getClassesReturn" type="tns:myarray"/>
  </wsdl:message>

  <wsdl:portType name="SchoolAPIPortType">
    <wsdl:operation name="getSubjects">
      <wsdl:input message="tns:getSubjectsRequest"/>
      <wsdl:output message="tns:getSubjectsResponse"/>
    </wsdl:operation>

    <wsdl:operation name="getClasses">
      <wsdl:input message="tns:getClassesRequest"/>
      <wsdl:output message="tns:getClassesResponse"/>
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="SchoolAPIBinding" type="tns:SchoolAPIPortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getSubjects">
      <soap:operation soapAction="urn:SchoolAPI/getSubjects" style="document"/>
      <wsdl:input> <soap:body use="literal"/></wsdl:input>
      <wsdl:output><soap:body use="literal"/></wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getClasses">
      <soap:operation soapAction="urn:SchoolAPI/getClasses" style="document"/>
      <wsdl:input> <soap:body use="literal"/></wsdl:input>
      <wsdl:output><soap:body use="literal"/></wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  
  <wsdl:service name="SchoolAPI">
    <wsdl:port name="SchoolAPIPort" binding="tns:SchoolAPIBinding">
      <soap:address location="http://localhost:82/myschool/webservices/SchoolAPI.php" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

The problem is that correct data is returned olny by first function declarated in <wsdl:binding> section. In this example correct data will be return by getSubjects function, and function getClassses return null. However, if we change order and put getClasses operation first in binding section like this:

 

  <wsdl:binding name="SchoolAPIBinding" type="tns:SchoolAPIPortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
 <wsdl:operation name="getClasses">
      <soap:operation soapAction="urn:SchoolAPI/getClasses" style="document"/>
      <wsdl:input> <soap:body use="literal"/></wsdl:input>
      <wsdl:output><soap:body use="literal"/></wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getSubjects">
      <soap:operation soapAction="urn:SchoolAPI/getSubjects" style="document"/>
      <wsdl:input> <soap:body use="literal"/></wsdl:input>
      <wsdl:output><soap:body use="literal"/></wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

 

then correct data will be return by getClasses function, and getSubjects will return null. Do you know what is going on? I do my best to solve this problem and I have no idea what is wrong...

 

 

I figure it out. This is solution:

 

  <wsdl:message name="getSubjectsRequest">
<part name="getSubjectsReq" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="getSubjectsResponse">
    <part name="getSubjectsReturn" type="tns:myarray"/>
  </wsdl:message>
  <wsdl:message name="getClassesRequest">
<part name="getClassesReq" type="xsd:string" />
  </wsdl:message>
  <wsdl:message name="getClassesResponse">
    <part name="getClassesReturn" type="tns:myarray"/>
  </wsdl:message>

 

Request Messages can't be empty.

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.