WSDL help.... possibly a complexTypes issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm trying to evaluate some non-Axis 1.1 SOAP services that are also servlet-based. One of the requirements is that they support PHP clients. The one I've found that I'm liking best so far is called XFire. I've used its example project to create a web service that generates the following WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; xmlns="http://schemas.xmlsoap.org/wsdl/"; xmlns:ns1="http://demo.xfire.codehaus.org"; xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:tns="http://xfire.codehaus.org/BookService"; xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://xfire.codehaus.org/BookService";>
  <wsdl:types>
<xsd:schema targetNamespace="http://xfire.codehaus.org/BookService"; elementFormDefault="qualified" attributeFormDefault="qualified">
      <xsd:element name="getBooks">
        <xsd:complexType />
      </xsd:element>
      <xsd:element name="getBooksResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="out" type="ns1:ArrayOfBook" minOccurs="1" maxOccurs="1" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="findBook">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="in0" type="xsd:string" minOccurs="1" maxOccurs="1" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="findBookResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="out" type="ns1:Book" minOccurs="1" maxOccurs="1" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
<xsd:schema targetNamespace="http://demo.xfire.codehaus.org"; elementFormDefault="qualified" attributeFormDefault="qualified">
      <xsd:complexType name="ArrayOfBook">
        <xsd:sequence>
<xsd:element name="Book" type="ns1:Book" nillable="true" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
      </xsd:complexType>
      <xsd:complexType name="Book">
        <xsd:sequence>
          <xsd:element name="author" type="xsd:string" nillable="true" />
          <xsd:element name="isbn" type="xsd:string" nillable="true" />
          <xsd:element name="title" type="xsd:string" nillable="true" />
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="getBooksRequest">
    <wsdl:part element="tns:getBooks" name="parameters" />
  </wsdl:message>
  <wsdl:message name="findBookRequest">
    <wsdl:part element="tns:findBook" name="parameters" />
  </wsdl:message>
  <wsdl:message name="findBookResponse">
    <wsdl:part element="tns:findBookResponse" name="parameters" />
  </wsdl:message>
  <wsdl:message name="getBooksResponse">
    <wsdl:part element="tns:getBooksResponse" name="parameters" />
  </wsdl:message>
  <wsdl:portType name="BookServicePortType">
    <wsdl:operation name="getBooks">
      <wsdl:input message="tns:getBooksRequest" name="getBooksRequest" />
      <wsdl:output message="tns:getBooksResponse" name="getBooksResponse" />
    </wsdl:operation>
    <wsdl:operation name="findBook">
      <wsdl:input message="tns:findBookRequest" name="findBookRequest" />
      <wsdl:output message="tns:findBookResponse" name="findBookResponse" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="BookServiceHttpBinding" type="tns:BookServicePortType">
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"; />
    <wsdl:operation name="getBooks">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="getBooksRequest">
        <wsdlsoap:body use="literal" />
      </wsdl:input>
      <wsdl:output name="getBooksResponse">
        <wsdlsoap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="findBook">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="findBookRequest">
        <wsdlsoap:body use="literal" />
      </wsdl:input>
      <wsdl:output name="findBookResponse">
        <wsdlsoap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="BookService">
    <wsdl:port binding="tns:BookServiceHttpBinding" name="BookServiceHttpPort">
      <wsdlsoap:address location="http://localhost:8080/xfire-demo/services/BookService"; />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Now, I'm not an expert with this, but the WSDL looks right to me, and to some extent it is... the following code works:

    $bookService = new SoapClient(
        "http://localhost:8080/xfire-demo/services/BookService?wsdl";,
        array( 'trace' => 1 ) );
    $books = $bookService->getBooks();
    print_r( $books );

However, the other function does not. The following code breaks:

    $bookService = new SoapClient(
        "http://localhost:8080/xfire-demo/services/BookService?wsdl";,
        array( 'trace' => 1 ) );
    $searchBook = "0123456789";
    $onlyBook = $bookService->findBook( $searchBook );
    print_r( $onlyBook );

When calling findBook(), I get the following SoapFault:
object(SoapFault)#7 (9) {
  ["message:protected"]=>
  string(0) ""
  ["string:private"]=>
  string(0) ""
  ["code:protected"]=>
  int(0)
  ["file:protected"]=>
  string(36) "/usr/local/apache2/htdocs/client.php"
  ["line:protected"]=>
  int(73)
  ["trace:private"]=>
  array(2) {
    [0]=>
    array(4) {
      ["function"]=>
      string(6) "__call"
      ["class"]=>
      string(10) "SoapClient"
      ["type"]=>
      string(2) "->"
      ["args"]=>
      array(2) {
        [0]=>
        string(8) "findBook"
        [1]=>
        array(1) {
          [0]=>
          string(10) "0123456789"
        }
      }
    }
    [1]=>
    array(6) {
      ["file"]=>
      string(36) "/usr/local/apache2/htdocs/client.php"
      ["line"]=>
      int(73)
      ["function"]=>
      string(8) "findBook"
      ["class"]=>
      string(10) "SoapClient"
      ["type"]=>
      string(2) "->"
      ["args"]=>
      array(1) {
        [0]=>
        string(10) "0123456789"
      }
    }
  }
  ["faultstring"]=>
string(96) "Illegal argument invoking 'org.codehaus.xfire.demo.BookService.findBook(java.lang.String)': null"
  ["faultcode"]=>
  string(6) "Server"
  ["faultcodens"]=>
  string(41) "http://schemas.xmlsoap.org/soap/envelope/";
}

Calling __getLastRequest() gives me (slightly formatted for readability):

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
    xmlns:ns1="http://xfire.codehaus.org/BookService";>
    <SOAP-ENV:Body>
        <ns1:findBook/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Obviously, the required (and passed) parameter doesn't make it to the SOAP request. Is there anything I can do that will make this work? Or is it a limitation of PHP5's SoapClient? If it is a limitation, is there any other PHP SOAP client that would work with this WSDL?

Thanks,

Mark

--
PHP Soap Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [PHP Users]     [Kernel Newbies]     [PHP Database]     [Yosemite]

  Powered by Linux