php 肥皂调用中的嵌套参数

nested parameters in php soap call

这是我第一次 运行 进入 SOAP 森林,所以我不知道自己在做什么,更糟糕的是,该公司的文档或代码示例为零。他们至少提供了一个示例调用。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetRatesIPXML>
        <tem:ipXML>
        <![CDATA[
                <XML>
            <RateInput>
              <GUID>12345</GUID> 
              <RepID>abc</RepID> 
              <ZipCode>55343</ZipCode>
              <EffectiveDate>1/15/2014</EffectiveDate>
              <DateOfBirth >12/15/1980</DateOfBirth > 
              <FilterPlanCode></FilterPlanCode> 
            </RateInput>
          </XML>]]>
    </tem:ipXML>
      </tem:GetRatesIPXML>
   </soapenv:Body>
</soapenv:Envelope>

我用过 SoapClient 和 NuSoap。我已经尝试了从嵌套数组到对象、字符串、simpleXML 的所有方法。我似乎无法弄清楚这一点,经过两天的谷歌搜索,我已经走到了尽头。 这是我当前的实现。

require('lib/nusoap.php');

class Carrier
{   
    const WSDL = 'http://getrates_staging.test.com/getrates.svc?wsdl';

    public function get()
    {
        $soapClient = new nusoap_client( self::WSDL , true);
        $soapClient->soap_defencoding = 'UTF-8';

        $string = ""
            . "<XML>"
            . "<RateInput>";

        $string .= "<GUID>12345</GUID>";

        $string .= "</RateInput></XML>";

        $response = $soapClient->call('GetRatesIPXML' , array('ipXML'=> $string) , '' , '', false, true);
        var_dump($soapClient->request);
        var_dump($soapClient->getError());
        var_dump($response);
    }
}

$foo = new Carrier();
$foo->get();

它的结果很接近,但所有 < 都被转义为 &lt;,所以这是行不通的。感谢任何帮助。

编辑

这与我想要的结果差不多

class Carrier
{   
    const WSDL = 'http://getrates_staging.test.com/getrates.svc?wsdl';

    public function get()
    {
        $soapClient = new SoapClient( self::WSDL , array('trace' => true));
        //$soapClient->soap_defencoding = 'UTF-8';

        $string = ""
            . "<![CDATA[ <XML>"
            . "<RateInput>";

        $string .= "<GUID>12345</GUID>";

        $string .= "</RateInput></XML> ]]>";

        $param = new SoapVar($string, XSD_ANYXML);

        $ipXML = new stdClass();
        $ipXML->ipXML = $param;

        try
        {
            $response = $soapClient->GetRatesIPXML($ipXML);
        }
        catch(Exception $e)
        {
            var_dump($e);
        }
        var_dump($soapClient->__getLastRequest());
        var_dump($response);
    }
}

$foo = new Carrier();
$foo->get();

我最后得到

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"><SOAP-ENV:Body><ns1:GetRatesIPXML><![CDATA[ <XML><RateInput><GUID>12345</GUID></RateInput></XML> ]]></ns1:GetRatesIPXML></SOAP-ENV:Body></SOAP-ENV:Envelope>

我不明白为什么它会掉落周围的 <ns1:ipXML>

编辑 2

在一天结束时,这奏效了。

class Carrier
{   
    const WSDL = 'http://getrates_staging.test.com/getrates.svc?wsdl';

    public function get()
    {
        $soapClient = new SoapClient( self::WSDL , array('trace' => true));
        //$soapClient->soap_defencoding = 'UTF-8';

        $string = ""
            . "<ns1:ipXML><![CDATA[ <XML>"
            . "<RateInput>";

        $string .= "<GUID>1234</GUID> 
              <RepID>1234</RepID> 
              <ZipCode>55343</ZipCode>
              <EffectiveDate>1/15/2016</EffectiveDate>
              <DateOfBirth >07/01/1983</DateOfBirth > 
              <FilterPlanCode></FilterPlanCode>";

        $string .= "</RateInput></XML> ]]></ns1:ipXML>";

        $param = new SoapVar($string, XSD_ANYXML);

        $ipXML = new stdClass();
        $ipXML->ipXML = $param;

        try
        {
            $response = $soapClient->GetRatesIPXML($ipXML);
        }
        catch(Exception $e)
        {
            var_dump($e);
        }
        var_dump($soapClient->__getLastRequest());
        var_dump($response);
    }
}

$foo = new Carrier();
$foo->get();

但这看起来很老套。如果有人有更好的建议,我愿意。

通常,XML 文档是使用 PHP "helper libraries" 构造(和解析)的,例如 SimpleXML (http://php.net/manual/en/book.simplexml.php), or techniques such as the ones described here (http://www.phpeveryday.com/articles/PHP-XML-Tutorial-P848.html).

XML文档被构造为内存中的数据结构(数组等),然后一口气转换成要发送的XML。

事实上,由于您正在做的是 SOAP,因此您可以在 that 之上进行一层抽象,例如(http://php.net/manual/en/book.soap.php)。存在现成的库,它们将处理构建 XML 有效载荷和发送它的任务,以及获取服务器响应和解码它们。 这是你应该开始的地方。

"Actum Ne Agas: Do Not Do A Thing Already Done."