Page 1 of 1

Help with PHP SOAP Server and WSDL

Posted: Tue Sep 01, 2009 9:10 am
by davidonpda
Okay, I have this SOAP server running in ASP already. We are getting rid of our windows server, so, moving our applications over to PHP.

I have three files, clienttest.php, server.php, and the TEST.wsdl. With my files, I can begin a SOAP session from clienttest.php, and I am returned my successful string in the WSDL defined "SendTicketResult"

My problem is, is that in the server.php, inside the SendTicket function, I am not getting any data from the client. I have tried our existing program, to send a real ticket to the php server, and I get the success response back perfectly, but I am not getting the ticket data anywhere.

Can anyone help me know what I am doing wrong :) And how to get the ticket from the client.

I also have a dataset that our clients use to format the data, I don't think that will help, but if I am wrong, tell me and I will upload that as well.


clienttest.php

Code: Select all

<?php
    //clienttest.php
    
    ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
    
    //Load the client with wsdl definition. NOTE: Setup the WSDL url
    $client = new SoapClient("TEST.wsdl");
    
    $data1 = array(
        'One_Call_Center' => 'UFPO',
        'Ticket_Number' => '03192-000-001',
        'Primary_CDC' => array(
            'CDC' => 'NIMO / WEST',
            'Sequence_Number' => 1,
        ),
        
        /*........ and all complex Type defined on TEST.wsdl and TicketDataSet.xsd*/
    );
            
    //Call function SendTicket and pass the params
    $rsl = $client->SendTicket($data1);
    
    //Print the results
    echo '<pre>';
    print_r($rsl);
    echo '</pre>';
    
?>

server.php

Code: Select all

<?php
function SendTicket($parameter){
 
    //server.php
 
    //This following part is just to see what I am getting sent because I am not getting anything
    $arrayObj = new ArrayObject(get_defined_vars());
    
        $file1=fopen("test.txt","w");
 
            for($iterator = $arrayObj->getIterator(); $iterator->valid(); $iterator->next()) {
                fwrite($file1, $iterator->key() . ' => ' . $iterator->current() );
            }       
 
        fclose($file1);
 
    
     //parameters, sendtickets, etc are all empty strings from the client. change top $parameter to anything else, still shows parameter as my only empty variable
    
    
    $result = array(
        'SendTicketResult' => 'successful',
    );
    
    //The results   
    return $result;
 
}   
    
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$server = new SoapServer("TEST.wsdl"); //NOTE: on TEST.wsdl configure the server's url. File lines: 65, 69 and 72
$server->addFunction("SendTicket");
$server->handle();
?>

and the TEST.wsdl

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://tempuri.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://tempuri.org/" xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="SendTicket">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="xmlTicket">
              <s:complexType mixed="true">
                <s:sequence>
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SendTicketResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="SendTicketResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SendAudit">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="xmlAudit">
              <s:complexType mixed="true">
                <s:sequence>
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SendAuditResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="SendAuditResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SendMessage">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="xmlMessage">
              <s:complexType mixed="true">
                <s:sequence>
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="SendMessageResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="SendMessageResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </types>
  <message name="SendTicketSoapIn">
    <part name="parameters" element="s0:SendTicket" />
  </message>
  <message name="SendTicketSoapOut">
    <part name="parameters" element="s0:SendTicketResponse" />
  </message>
  <message name="SendAuditSoapIn">
    <part name="parameters" element="s0:SendAudit" />
  </message>
  <message name="SendAuditSoapOut">
    <part name="parameters" element="s0:SendAuditResponse" />
  </message>
  <message name="SendMessageSoapIn">
    <part name="parameters" element="s0:SendMessage" />
  </message>
  <message name="SendMessageSoapOut">
    <part name="parameters" element="s0:SendMessageResponse" />
  </message>
  <portType name="TESTWebServiceSoap">
    <operation name="SendTicket">
      <input message="s0:SendTicketSoapIn" />
      <output message="s0:SendTicketSoapOut" />
    </operation>
    <operation name="SendAudit">
      <input message="s0:SendAuditSoapIn" />
      <output message="s0:SendAuditSoapOut" />
    </operation>
    <operation name="SendMessage">
      <input message="s0:SendMessageSoapIn" />
      <output message="s0:SendMessageSoapOut" />
    </operation>
  </portType>
  <portType name="TESTWebServiceHttpGet" />
  <portType name="TESTWebServiceHttpPost" />
  <binding name="TESTWebServiceSoap" type="s0:TESTWebServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
    <operation name="SendTicket">
      <soap:operation soapAction="http://tempuri.org/SendTicket" style="document" />
      <input>
        <soap:body use="literal" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
    <operation name="SendAudit">
      <soap:operation soapAction="http://tempuri.org/SendAudit" style="document" />
      <input>
        <soap:body use="literal" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
    <operation name="SendMessage">
      <soap:operation soapAction="http://tempuri.org/SendMessage" style="document" />
      <input>
        <soap:body use="literal" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
  </binding>
  <binding name="TESTWebServiceHttpGet" type="s0:TESTWebServiceHttpGet">
    <http:binding verb="GET" />
  </binding>
  <binding name="TESTWebServiceHttpPost" type="s0:TESTWebServiceHttpPost">
    <http:binding verb="POST" />
  </binding>
    <service name="TESTWebService">
        <port name="TESTWebServiceSoap" binding="s0:TESTWebServiceSoap">
            <soap:address location="server.php"/>
        </port>
    <port name="TESTWebServiceHttpGet" binding="s0:TESTWebServiceHttpGet">
      <http:address location="server.php" />
    </port>
    <port name="TESTWebServiceHttpPost" binding="s0:TESTWebServiceHttpPost">
      <http:address location="server.php" />
    </port>
    </service>
</definitions>

Re: Help with PHP SOAP Server and WSDL

Posted: Tue Sep 01, 2009 2:33 pm
by Darhazer
get_defined_vars returns exactly the defines vars, in the case $parameters
better use func_get_args() to see what have beed passed to the function