Давайте представим, у нас есть несколько разнообразных веб-сервисов. Они могут быть написаны на разных языках разными людьми в разное время. Допустим, нам нужно где-то на стороннем сервисе запустить какую-то процедуру. Что нам делать?
В самом упрощенном смысле – взаимодействие может осуществляться через URL. Просто дергаете http://site/func_url.php?param1=123¶m2=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
Для использования данного сопряжения больше ничего знать не нужно. Спасибо за внимание, удачных разработок
Константин
Остаётся добавить, что не всё так гладко.
В PHP есть баг, по которому при возврате сервером "500 server error" ошибки - скрипт думает, что всё успешно отправил. Единственный способ контрольно его проверить - эмулировать отправку запроса через cURL или используя любой сетевой сниффер