Search code examples
phpweb-servicessoapwsdlaxis

PHP SOAPCall null result


I have deployed a SOAP WS with AXIS. I use SOAPClient library and PHP 5.5.9 on Ubuntu 14.04 to call the exposed operations, but when I make the "__SoapCall" it returns nothing. I have also tried with "NuSOAP" library, but I obtain the same result. But when I call "__getLastResponse", It returns the good response (although duplicated), as you can see:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <idXMLReturn xmlns="http://aemetproyecto">PD94bWwgdm...</idXMLReturn>
    </soapenv:Body>
</soapenv:Envelope>

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <idXMLReturn xmlns="http://aemetproyecto">PD94bWwgdm...</idXMLReturn>
    </soapenv:Body>
</soapenv:Envelope>

Here is the WSDL

My PHP code:

<?php

    function generarTabla($id, $formato){
        try{

            // Create the SoapClient instance 
            $url = "http://localhost:8080/axis/services/AemetProyect?wsdl";

            $client = new SoapClient($url, array("trace" => 1, "exception" => 1));

            // Creo XML
            $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
            $xml .= "<!DOCTYPE id [\n";
            $xml .= "<!ELEMENT id (#PCDATA)>\n";
            $xml .= "]>\n";
            $xml .= "<id>".$id."</id>";

            // Codifico XML en Base64
            $Base64xml = base64_encode($xml);

            // Llamada SOAP a DescargarInfoTiempo
            $resultado = $client -> __soapCall("DescargarInfoTiempo",
                                                array($Base64xml));

            //$resultado = $client -> __getLastResponse();
            //echo $resultado;
            //$resultado = $client -> __getLastRequest();
            //echo $resultado;

            echo $resultado;
        } catch (SoapFault $ex){
            $error = "SOAP Fault: (faultcode: {$ex->faultcode}\n"
                                ."faultstring: {$ex->faultstring})";
            echo $error;
        } catch (Exception $e){
            $error = "Exception: {$e->faultstring}";
            echo $error;
        }
    }

?>

I've noticed that the name of return element ("idXMLReturn") is not the same that the name described in WSDL ("DescargarInfoTiempoReturn"). Can this be the problem?

Update

I've tried to do:

$argumens['idXML'] = $Base64xml;
$resultado = $client -> __soapCall("DescargarInfoTiempo",
                                                    array($arguments));

and

$arguments['idXML'] = $Base64xml;
$resultado = $client ->DescargarInfoTiempo($arguments);

But then I get "Notice: Array to string conversion" when I do the call.


Solution

  • As I said above, "I've noticed that the name of return element ("idXMLReturn") is not the same that the name described in WSDL ("DescargarInfoTiempoReturn")" So, that's the problem: AXIS doesn't generate a Envelope that fits to the WSDL schema. It seems java:RPC provider doesn't worry about the return names of operations.

    For now, I've solved it by renaming the parameter from "idXML" to "DescargarInfoTiempo", so SOAP response will be "DescargarInfoTiempoReturn" and it will fit with the WSDL schema and PHP will map the response correctly.