Простая реализация взаимодействия между приложениями через 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
  • Просмотров: 1088
  • Комментариев: 1
  • Создан: 18.03.2013 13:22

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

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

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

Ваши предложения и пожелания пишите на pro@kosmom.ru

Теги

backup bootstrap core framework eloquent excel home project html ios javascript keep-alive kpi laravel legacy mvp orm php rip scroll timestamp undefined vue vuetify watch безопасность биометрический паспорт ваша любаша для путешествий загран на 10 лет загран паспорт загранпаспорт нового образца зимние книги как заполнить анкеты кеширование книги на новый год логирование мцф недвижимость новогодние книги образец заполнения антеты паспорт для путешествий паспорт нового поколения печать продукт проектирование прокси разработка ремонт ремонт в апартаментах ремонт нежилого помещения самокат сдача сколько стоил ремонт апартаментов спорт стандарты таблица финансы хостинг цена ремонта что почитать зимой юзабилити

Случайный пост

26.12.2015 09:00
Неделя 7 - 13 декабря 2015 года