Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > PHP + SOAP запрос


Автор: glebskvortsov 14.1.2010, 14:48
Проблема вот какая:
пишется клиент на php + soap для работы с веб-сервисом.

В конечном итоге запрос должен представлять из себя следующее:

Код

<HeadlineMLRequest>
     <TimeOut>600</TimeOut>
     <MaxCount>10</MaxCount>
     <Filter>
          <MetaDataConstraint class="language">
               <Value>RU</Value>
          </MetaDataConstraint>
     </Filter>
</HeadlineMLRequest>

Хоть это и не особо важно, суть запроса - получение заголовков новостей. По данному запросу должны выводиться 10 новостей на русском языке. Об этом нам говорят ключевые парметры TimeOut, аттрибут class и элемент Value. 
В общем случае запрос корректно отрабатывает и без элемента Filter, в этом случае новости поступают на всех языках, содержащихся в базе.

Если отбросить код на подключение к сервису и отправку заголовков, то доступ к функции получения заголовков на основе WSDL выглядит следующим образом:

Код
$response2 = $client2->RetrieveHeadlineML_1(array('HeadlineMLRequest'=>array('TimeOut'=>600, 'MaxCount'=>10, 'Filter'=>array('MetaDataConstraint'=>array('class'=>'language', 'Value'=>'ru'))))));


В режиме трассировки тело запроса генерится следующим образом:

Код

<env:Body>
     <ns1:RetrieveHeadlineML_Request_1>
          <ns1:HeadlineMLRequest>
               <ns1:TimeOut>600</ns1:TimeOut>
               <ns1:MaxCount>10</ns1:MaxCount>
               <ns1:Filter>
                    <ns2:MetaDataConstraint class="language">
                         <ns2:Value/>
                    </ns2:MetaDataConstraint>
               </ns1:Filter>
           </ns1:HeadlineMLRequest>
     </ns1:RetrieveHeadlineML_Request_1>
</env:Body>


Из ответа видно, что элемент Value по какой-то причине генерится пустым и поэтому ответ приходит пустым. Есть какие-нибудь идеи на этот счет?

Спасибо.

Автор: Simpliest 14.1.2010, 17:23
Какой режим работы? WSDL или нет?

Попробуй обернуть Value в array() еще раз.
Или воспользуйся SoapParam/SoapVar

Автор: glebskvortsov 15.1.2010, 10:08
Да, работает в режиме WSDL. Пробовал оборачивать еще в массивы, эффект такой же, Value пустым отправляется.
Также пробовал использовать SoapVar и Param, в этом случае вообще ругается на отсутствие Value.

Но, к примеру, с другой похожей функцией из сервиса отрабатывает корректно.

Такой запрос:
Код

<ItemRequest Scope="All">
     <Fields />
     <RequestKey Name="EUR=" Service="" NameType="RIC">
</ItemRequest>


и PHP код: 
Код

$response3 = $client3->RetrieveItem_1(array('ItemRequest'=>array('Scope'=>'All', 'Fields'=>'a', 'RequestKey'=>array('Name'=>'EUR=', 'NameType'=>'RIC'))))


отрабатывает корректно и правильно расставляет из массива значения соответствующих атрибутов и элементов:

Код

<env:Body>
     <ns2:RetrieveItem_Request_1>
          <ns2:ItemRequest Scope="All">
               <ns1:Fields>a</ns1:Fields>
               <ns1:RequestKey Name="EUR=" NameType="RIC"/>
          </ns2:ItemRequest>
     </ns2:RetrieveItem_Request_1>
</env:Body>


Принцип в обоих запросах одинаков: в одмн массив должны заворачиваться текущий элемент, его атрибуты и вложенные элементы с атрибутами следующего уровня. Во втором запрос генерится правильно, а в первом нет. Неясно короче.

Автор: Simpliest 15.1.2010, 15:43
Посмотри WSDL возможно он как-то весело сформирован.

Вот такой запрос какой xml формирует?
Код

array('HeadlineMLRequest'=>array('TimeOut'=>600, 'MaxCount'=>10, 'Filter'=>array('MetaDataConstraint'=>array('class'=>'language', 'Value'=>array('value' =>'ru')))))));


Добавлено через 38 секунд
P.S. иногда помогает перейти в режим non-WSDL

Добавлено через 3 минуты и 33 секунды
Цитата(glebskvortsov @  15.1.2010,  09:08 Найти цитируемый пост)
Принцип в обоих запросах одинаков: в одмн массив должны заворачиваться текущий элемент, его атрибуты и вложенные элементы с атрибутами следующего уровня. 

В этом-то и фокус, что они не одинаковы. Во втором запросе у тебя нет нод уровнем ниже ноды с атрибутами. А именно из-за этих атрибутов и возникают проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)