php soap调用中的嵌套参数

时间:2015-04-21 15:21:21

标签: php soap

这是我第一次进入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();

但它似乎太乱了。如果有人有更好的建议,我可以打开。

1 个答案:

答案 0 :(得分:1)

通常,使用PHP“帮助程序库”(如SimpleXML(http://php.net/manual/en/book.simplexml.php))或诸如此处所述的技术(http://www.phpeveryday.com/articles/PHP-XML-Tutorial-P848.html)构建(和解析)XML文档。

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

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

“Actum Ne Agas:不做任何事情。”