Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Простой soap приемник


Автор: Su_ 7.5.2013, 13:25
Всем доброго дня!

До сего работал с REST и проблем не знал, но понадобилось разбирать с протоколом SOAP. Причем soap используют только как транспорт для данных. Есть wsdl файл описывающий типы, сообщение и т.д.

Где можно найти примере простого Soap приемника строящегося на базе wsdl?

Есть пример простого сервера:

Код

$server = new SoapServer("interaction.wsdl");  
$server->setClass("ValueService");  
$server->handle(); 


Что он должен делать?

Автор: Sanchezzz 7.5.2013, 14:22
Код

class ValueService {
  public function test(){     echo __CLASS__, "::", __METHOD__; }
  public function __construct() { }

}

$server = new SoapServer("interaction.wsdl");  //Создаем сервер 
$server->setClass("ValueService");   // экспортирует из указанного класса методы 
$server->handle();  // слушает какой запрос и выполняет по условию нужную функцию согласно запросу SOAPCLIENT 


$server->handle() Сеттер параметр это переопределение обработчик если не задан то транспортный уровень работает по умолчанию 
SoapServer::__doRequest, его также можно переопределить через наследование класса

Автор: Su_ 7.5.2013, 14:40
Спасибо, т.е. как я понял по сути в классе ValueService нужно описать методы которые могут придти от soap клиента?

К примеру в wsdl есть тег binding и в нем:

Код

<wsdl:operation name="publishIncident">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="publishIncident">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="publishIncidentResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

 
Получается если мы в классе ValueService создам метод  publishIncident
 
Код

class ValueService {
  public function test(){     echo __CLASS__, "::", __METHOD__; }
  public function publishIncident($data){

doSomthing($data);


}
  public function __construct() { }
}
$server = new SoapServer("interaction.wsdl");  //Создаем сервер 
$server->setClass("ValueService");   // экспортирует из указанного класса методы 
$server->handle();  // слушает какой запрос и выполняет по условию нужную функцию согласно запросу SOAPCLIENT


То при обращение к такому серверу soap клиента , будет исполнит метод класса ValueService?


И еще вопрос если позволите, как получить тело soap запроса, т.е. по сути xml. 
Т.е. handle ждет на 80 или 8080 порту клиента, к нему приходит пакет, в теле которого xml (soap) как это xml захватить и например записать в файл?

Автор: Fortop 7.5.2013, 19:16
Цитата(Su_ @  7.5.2013,  14:40 Найти цитируемый пост)
То при обращение к такому серверу soap клиента , будет исполнит метод класса ValueService?

В общем и целом - да. Есть нюансы лишь в корректности описаний сервиса


Цитата(Su_ @  7.5.2013,  14:40 Найти цитируемый пост)
И еще вопрос если позволите, как получить тело soap запроса, т.е. по сути xml. 

Зачем?

http://ua2.php.net/manual/ru/class.soapclient.php

Автор: Su_ 7.5.2013, 19:20
Цитата

Зачем?

Я так понимаю soap можно использовать как RPC так и просто по передаче данных.

В частности клиент может сам посылать данные на сервер?

Т.е. клиент вызывает url и передает в пакете данные в формате soap.

Как эти данные на сервере сохранить в файл например?

Автор: Fortop 8.5.2013, 17:22
Цитата(Su_ @  7.5.2013,  19:20 Найти цитируемый пост)
Я так понимаю soap можно использовать как RPC так и просто по передаче данных.

Можно, но неэффективно.
Слишком большой оверхед для всего лишь передачи данных.

Цитата(Su_ @  7.5.2013,  19:20 Найти цитируемый пост)
Как эти данные на сервере сохранить в файл например?

Но тебе же не нужен весь soap-пакет

Тебе нужны лишь данные, которые пришли в нем

Пишешь метод/функцию, которая будет сохранять полученные данные в файл.
И клиентом шлешь данные именно этому методу.


Если ты не планируешь работать кроссплатформенно, то посмотри реализацию Zend_Soap_Server/Zend_Soap_Client
Они избавят тебя от необходимости написания правильного wsdl

Если в планах взаимодействие с .net/java тогда можешь погружаться в спецификации

Добавлено через 53 секунды
P.S. по указанной ссылке на php.net есть информация как получить доступ к raw данным soap-пакета

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