2015-04-21 2 views
2

Это мой первый запуск в SOAP-лес, поэтому я понятия не имею, что я делаю и что хуже, у компании есть нулевые документы или примеры кода. Они, по крайней мере, предоставляют примерный вызов.Вложенные параметры в php soap call

<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(); 

Но это кажется настолько взломанным. Если у кого-то есть лучшее предложение, я открыт.

+0

похоже, что вы просматриваете вывод в браузере, который преобразует '<' в '<'; сам вывод может быть правильным – user4416936

+0

Возможно, я рассмотрю это, но я запускаю это через инструмент командной строки. – Squeegy

ответ

1

Обычно XML-документы строятся (и анализируются) с использованием «вспомогательных библиотек» PHP, таких как SimpleXML (http://php.net/manual/en/book.simplexml.php), или техник, которые описаны здесь (http://www.phpeveryday.com/articles/PHP-XML-Tutorial-P848.html).

XML-документ построен как структура данных в памяти (массивы и т. Д.), А затем преобразован одним движением в XML, который должен быть отправлен.

Фактически, поскольку то, что вы делаете, является SOAP, вы можете пройти один уровень абстракции выше , который, например. (http://php.net/manual/en/book.soap.php). Существуют готовые библиотеки, которые будут обрабатывать как задачу построения полезной нагрузки XML, так и ее отправку, а также получать ответы сервера и декодировать их. Это, где вы должны начать.

«Актум Не Агас: не делай того, что уже сделано».

Смежные вопросы