Простая реализация взаимодействия между приложениями через SOAP

Давайте представим, у нас есть несколько разнообразных веб-сервисов. Они могут быть написаны на разных языках разными людьми в разное время. Допустим, нам нужно где-то на стороннем сервисе запустить какую-то процедуру. Что нам делать?

В самом упрощенном смысле – взаимодействие может осуществляться через URL. Просто дергаете http://site/func_url.php?param1=123&param2=234

Проблемы начинаются при запуске. Данный GETзапрос может быть ограничен и не воспринят системой при передаче больших параметров. Данные запроса попадают во все возможные логи, и могут быть прочитаны вместе с паролями. Да и не всегда передача данных ограничивается одной лишь функцией, чаще всего – это какая-то транзакция

А какие методы существуют? А что они возвращают? Нужно разработчикам постоянно писать инструкции с примерами... Хватит!

 

Как вариант решения всех этих трудностей и создания универсального способа – можно использовать SOAP расширение. Что же это такое?

SOAP подразумевает под собой некий справочный файл в виде XML с расширением WSDL. Вам дают этот файл и все. Больше вам ничего не нужно. В данном файле прописываются все функции и все форматы данных. Для программы в файле содержатся пути обращения.

Разберем вариант реализации приложения на  простом языке PHP. Нам понадобится PHP 5.3, или подключенный модуль SOAP. Сам файл WSDL может быть довольно громоздким и не понятным с первого раза, может собираться из множества WSDL файлов. Давайте подключимся к нему и узнаем все возможные методы и типы данных через PHP. Делается это очень просто

$wsdl = "http://site/url-to-wsdl.xml"; // путь к нашему WSDL файлу
$client = new SoapClient($wsdl);
print_r($client->__getFunctions()); // получаемсписокфункций
print_r($client->__getTypes()); // получаем список типов данных

На выходе, если все правильно подключено и настроено – нас ждут функции, например

Array
(
    [0] => func1Response func1(func1 $parameters)
    [1] => func2Response func2(func2 $parameters)
)
И описание типов данных
Array
(
    [0] => struct func1 {
                       int var1;
                       string msg;
                       boolean notification;
                       }
    [1] => struct func1Response {
                       boolean return;
        }
    [2] => struct func2 {
                       int var1;
                       string msg;
                       boolean notification;
        }
    [3] => struct func2Response {
                       boolean return;
        }
)

Исходя из вывода – мы видим, что нам доступны 2 функции, которые используют 4 типа данных

Func1 и Func2 – на вход подается массив с 3 переменными с числовым, строковым и логическим типами. На выходе – логическое значение trueили false.

Мы можем предположить, что ответ сообщает об успешности вызова функции. Это уже зависит от настроек на выходящей стороне. Остается только взять и использовать эти функции. Делается это просто:

$res = $client->func1(array('var1'=>12345,'msg'=>iconv('Windows-1251','utf-8','Отправкарусскихсимволов'),'notification'=>true));
var_dump($res);

Конвертация ICONV нужна лишь в случае, если Ваш проект реализован не в кодировке UTF-8. Еще один повод использовать UTF-8

В тестовой системе, если WSDL файл будет меняться - используйте директиву, чтобы файл не кешировался.

ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache

Для использования данного сопряжения больше ничего знать не нужно. Спасибо за внимание, удачных разработок

  • Автор: kosmom
  • Рейтинг: 0
  • Просмотров: 650
  • Комментариев: 1
  • Создан: 18.03.2013 13:22

Комментарии (1)

20.04.2016 11:34
Константин

Остаётся добавить, что не всё так гладко.
В PHP есть баг, по которому при возврате сервером "500 server error" ошибки - скрипт думает, что всё успешно отправил. Единственный способ контрольно его проверить - эмулировать отправку запроса через cURL или используя любой сетевой сниффер