PHP SOAPCall null结果

时间:2015-05-20 18:53:44

标签: php web-services soap wsdl axis

我已经使用AXIS部署了SOAP WS。我在Ubuntu 14.04上使用SOAPClient库和PHP 5.5.9来调用公开的操作,但是当我创建“__SoapCall”时它什么也没有返回。我也试过“NuSOAP”库,但我得到了相同的结果。 但是,当我调用“__getLastResponse”时,它会返回良好的响应(尽管重复),如您所见:

<?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

我的PHP代码:

<?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;
        }
    }

?>

我注意到返回元素的名称(“idXMLReturn”)与WSDL中描述的名称(“DescargarInfoTiempoReturn”)不同。 这可能是问题吗?

更新

我试过:

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

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

但是当我接听电话时,我得到“通知:数组到字符串转换”。

3 个答案:

答案 0 :(得分:1)

您的错误有点详细。

对于使用SoapClient的调用,您必须在参数数组中发送参数,而不是发送xml(为什么需要编写base64?是WebService的一些规则吗?)。请参阅PHP docs以获得正确的方法

  

<强>参数   传递给函数的参数数组。这可以是有序数组或关联数组。请注意,大多数SOAP服务器都需要提供参数名称,在这种情况下,它必须是关联数组。

所以,你的数组参数*必须是这样的:

$arguments['id'] = $id// if you need base 64, use base64_encode($id) or something
$resultado = $client -> __soapCall("DescargarInfoTiempo",array($arguments));

执行相同操作的其他选项是直接调用函数:

$arguments['id'] = $id// if you need base 64, use base64_encode($id) or something
    $resultado = $client ->DescargarInfoTiempo($arguments);// note that we don't need array($arguments), just $arguments

请参阅文档页面上的评论中的其他示例。

最后,如果您仍想创建要发送的XML,我建议您使用其他方法(如file_get_contents或CURL)执行此操作,并且不要忘记使用soap信封创建XML,{ {3}}

*一些旧的WebServices需要一个名为&#34;参数&#34;

的数组

<强>更新

看,您尝试在只包含一个元素的数组中发送$参数:$ Base64xml var中的XML。我认为问题仍然存在。

根据Soap Protocol ,您无法在SoapCall中发送XML 。 var必须是与您的vars 的关联数组,因此请尝试执行以下操作:

$arguments['id'] = $id// this $id var is your function argument(int, string or somenthing else), forget the created XML
    $resultado = $client -> __soapCall("DescargarInfoTiempo",array($arguments));

关于您需要的base64,我之前从未需要它,但请参阅PHP manual

页面中的 marcovtwout 评论
  

如果您的WSDL文件包含base64Binary类型的参数,则在传递soap变量时不应使用base64_encode()。在执行请求时,SOAP库会自动对您的数据进行base64编码,否则您将对其进行两次编码。

所以,我相信你不需要对你的vars进行编码。

简而言之,忘记XML并仅发送您的变量。 PHP SoapClient使用更正的编码和所有这些东西创建Soap信封。

如果您在执行此操作时仍遇到问题,请尝试将var包含在PHP manual中。也许你的WSDL配置需要这种处理。

我希望这会有所帮助

答案 1 :(得分:0)

正如我上面所说,&#34;我注意到返回元素的名称(&#34; idXMLReturn&#34;)与WSDL中描述的名称不同( &#34; DescargarInfoTiempoReturn&#34)&#34; 那就是问题所在:AXIS没有生成适合WSDL架构的Envelope。看来java:RPC提供商并不担心操作的返回名称。

目前,我已经通过重命名参数&#34; idXML&#34;来解决这个问题。到&#34; DescargarInfoTiempo&#34;,所以SOAP响应将是&#34; DescargarInfoTiempoReturn&#34;它将适合WSDL模式,PHP将正确映射响应。

答案 2 :(得分:0)

解决方案是指定文档文字样式,如中所述 Creating a SOAP call using PHP with an XML body