Задать вопрос

Как при помощи Zend_Soap_Client выполнить запрос при известной WSDL-схеме?

Имеется объект Zend_Soap_Client. Подключаюсь и выполняю запрос так:



$client = new Zend_Soap_Client($uri,<br>
        array(<br>
            'login' => $login,<br>
            'password' => $password,<br>
            'soapVersion' => SOAP_1_1)<br>
        );<br><br>
/*<br>
 * GetIdentityInfo<br>
 *<br>
 */<br><br>
$params = array('Profile' => $profile);<br>
$result = $client->GetIdentityInfo($params);<br>
print($result->GetIdentityInfoResult->any);<br>
print($client->getLastRequest());<br><br>
/*<br>
 * SubmitXml<br>
 * <br>
 */<br><br>
$request = simplexml_load_file('./request.xml');<br>
$filter = simplexml_load_file('./filter.xml');<br><br>
$request = xml2array($request);<br>
$filter = xml2array($filter);<br><br>
$params = array(<br>
    'Profile' => $profile,<br>
    'Request' => $request,<br>
    'Filter' => $filter);<br><br>
$result1 = $client->SubmitXml($params);<br><br>
   function xml2array($xml) {<br>
      $arXML=array();<br>
      $arXML['name']=trim($xml->getName());<br>
      $arXML['value']=trim((string)$xml);<br>
      $t=array();<br>
      foreach($xml->attributes() as $name => $value) $t[$name]=trim($value);<br>
      $arXML['attr']=$t;<br>
      $t=array();<br>
      foreach($xml->children() as $name => $xmlchild) $t[$name]=xml2array($xmlchild);<br>
      $arXML['children']=$t;<br>
      return($arXML);<br>
   }<br><br>




где $request, $filter — XML-данные (сначала как объект, затем преобразуется в массив).



Имеется WSDL-схема. Существенный кусок привожу ниже:



<s:element name="SubmitXml"><br>
<s:complexType><br>
<s:sequence><br>
<s:element maxOccurs="1" minOccurs="0" name="Profile" type="s:string"/><br>
<s:element maxOccurs="1" minOccurs="0" name="Request"><br>
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType><br>
</s:element><br>
<s:element maxOccurs="1" minOccurs="0" name="Filter"><br>
<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType><br>
</s:element><br>
</s:sequence><br>
</s:complexType><br>
</s:element>




В первом запросе GetIdentityInfo параметр Profile проходит отлично, получаю нормальный ответ.



Во втором запросе SubmitXml параметр Profile также кушает нормально, ибо это type=«s:string». Ругается на Request и Filter ибо это XML в виде массива (или объекта?).



Отвечает:



PHP Fatal error: SOAP-ERROR: Encoding: object hasn't 'any' property in /usr/share/php/libzend-framework-php/Zend/Soap/Client.php on line 1113<br/>
PHP Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'any' property in /usr/share/php/libzend-framework-php/Zend/Soap/Client.php:1113




Вопрос: как быть с параметрами Request и Filter? Как мне их корректно передать? Если объект, то в каком виде?

Я вот вижу этот «any» и близок к разгадке…

В каком виде отдать параметр, соответствующий этому описанию?



<s:complexType><br>
<s:sequence><br>
<s:any/><br>
</s:sequence><br>
</s:complexType>
  • Вопрос задан
  • 4613 просмотров
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Zyava
@Zyava
forum.codenet.ru/showthread.php?t=63209
Вы же нашли ответ, неплохо было бы и тут его тоже написать.
Ответ написан
foxweb
@foxweb Автор вопроса
Правильный ответ, если кто-то искал похожее:


$client = new Zend_Soap_Client($uri,
        array(
            'login' => $login,
            'password' => $password,
            'soapVersion' => SOAP_1_1)
        );

$r_xml = simplexml_load_file('./request.xml');
$f_xml = simplexml_load_file('./filter.xml');

$p_obj = new SoapVar($profile, XSD_STRING);
$r_obj = new SoapVar($r_xml, SOAP_ENC_OBJECT);
$f_obj = new SoapVar($f_xml, SOAP_ENC_OBJECT);

$params = array(
    'Profile' => $p_obj,
    'Request' => $r_obj,
    'Filter' => $f_obj
    );
$result = $client->SubmitXml($params);


Содержимое request.xml и filter.xml должно быть обрамлено в и тэги соответственно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы