Xpoint
   [напомнить пароль]

Передача XML с помощью NuSOAP

Метки: [без меток]
2009-02-16 11:19:48 [обр] zmey[досье]

Привет!

Веб-сервис, с которым я работаю с помощью NuSOAP, просит данные в следующем формате:

<soap:Body>
   <SubmitXml xmlns="http://webservices.somesite.com">
       <Profile>string</Profile>
       <Request>xml</Request>
       <Filter>xml</Filter>
   </SubmitXml>
</soap:Body>

с Profile все ясно - обычное строковое значение. А вот как передавать xml внутри xml (так получается), мне непонятно. Кто-нибудь может подсказать?
Спасибо!

спустя 14 часов [обр] Василий Свиридов(53/175)[досье]
Замените все XML Entities ( < на &lt; и т.п.) и заверните в <![CDATA[]]>
спустя 8 часов [обр] Александр Петров(2/4)[досье]
zmey[досье], я решал подобную задачу, только на стандартном расширении PHP. То что предложил Василий Свиридов[досье] конечно работает, но прелесть SOAP в том что он может кодировать ответ и запрос по двум типам rpc и doc. Вам нужен именно второй потому как он позволяет передавать произвольные структуры.
спустя 1 час 47 минут [обр] zmey[досье]

Спасибо за ответы! Сделал как рекомендовал Василий Свиридов[досье], но кокос по-прежнему не растет и крокодил не ловится. Попробую пояснить подробнее, что я делаю.

В скрипте загружаю nusoap, задаю всякие какие нужны настройки, затем готовлю данные и отправляю их вебсервису:

$request = "<LongLongXML>...</LongLongXML>";
$request = str_replace("<", "&lt;", $request);
$request = str_replace(">", "&gt;", $request);
$request = "<![CDATA[".$request."]]>";

$filter = "<LongLongXML>...</LongLongXML>";
$filter = str_replace("<", "&lt;", $filter);
$filter = str_replace(">", "&gt;", $filter);
$filter = "<![CDATA[".$filter."]]>";

$param = array(
      array('Profile' => 'ProfileName9999'),
      array('Request' => $request),
      array('Filter' => $filter)
      );

$result = $client->call('SubmitXml', $param, $namespace);

Естественно, ничего не работает. Вебсервис ругается: Required parameters for method SubmitXml are null.

А NuSOAP показывает, что я отправляется запрос:

...
<SOAP-ENV:Body>
   <SubmitXml xmlns="http://webservices.somesite.com">
      <Profile>ProfileName9999</Profile>
   </SubmitXml>
</SOAP-ENV:Body>
...

То есть видно, что запрос собирается некорректный. Так что пока так. Куда смотреть дальше?

спустя 10 часов [обр] Василий Свиридов(53/175)[досье]
Это был конечно приём слишком уж прямой. С нюСоап работал когда-то давно, и уже не помню всех тонкостей. И кстати, лучше наверное пользоваться htmlentities а не менять вручную.
спустя 15 часов [обр] Александр Петров(2/4)[досье]
zmey[досье], я тоже давно и сейчас сложно разобраться не хватает исследований, но есть внутреннее ощущение что имеет место концептуальная ошибка работы с SOAP. Обратите внимание на wsdl схему, там все описано как что вызывать. Стройте клиента по WSDL. Можно глянуть WSDL схему?
спустя 3 минуты [обр] Александр Петров(2/4)[досье]

Настораживает уже то что

Веб-сервис, с которым я работаю с помощью NuSOAP, просит данные в следующем формате:

Он просит данные в XML, а вы ему htmlentities. Он ждет xml а вы ему код который вызовет ошибку если его не ожидать.

Из того что я выцепил из поста возможно причина в этом

спустя 2 минуты [обр] Александр Петров(2/4)[досье]
Советую Altova XmlSpy. Там удобно можно генерировать и схемы и редактировать запросы soap.
Запустить программу подключиться к серверу SOAP и попытаться дать ему htmlentities и валидный XML и понаблюдать за реакцией.
спустя 1 месяц 13 дней [обр] zmey[досье]
Всем спасибо за ответы! Проблема не решена, а, так скажем, заморожена.
спустя 12 дней [обр] zmey[досье]

Всем привет!

По сабжу мне удалось получить рабочий пример скрипта на PHP5. Он не использует библиотеку NuSOAP.
Итак, в моём случае нужно делать примерно так:

$xmlRequest = "<LongXMLIsLooong>...</LongXMLIsLooong>";
$xmlFilter = "<_ />";

$r = new SoapVar("<Request>".$xmlRequest."</Request>", XSD_ANYXML);
$f = new SoapVar("<Filter>".$xmlFilter."</Filter>", XSD_ANYXML);

// Submit the Xml Request to the host
$response = $client->SubmitXml(array("Profile" => "ProfileName9999", "Request" => $r, "Filter" => $f));

Powered by POEM™ Engine Copyright © 2002-2005