Работа с веб-серверами на php посредством SOAP

    Не буду останавливаться на вопросе, что такое веб-сервисы и зачем они нужны. В сети очень много статей на эту тему. Просто постараюсь вкратце показать, каким простым способом возможно создание клиента к любому веб-сервису на php.


    Настройка

    Для использования SOAP в php необходимо подключить модуль SOAP (входит в дистрибутив php5). Под windows это делается просто – необходимо дописать (именно дописать, так как эта строка там не просто закомментирована, она отсутствует вообще) в php.ini:
    extension=php_soap.dll

    Не забудьте перезапустить сервер, если php у вас установлен как модуль.

    Создание SOAP-клиента по WSDL-документу

    Создание SOAP-клиента обычно происходит по WSDL-документу, который представляет собой XML-документ в определенном формате, полностью описывающий тот или иной веб-сервис. За подробностями по поводу WSDL – отправляю Вас на сайт консорциума W3C — www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510.

    Главное же, что необходимо знать для того, чтобы построить клиента к веб-сервису – это знать URL его WSDL-документа.
    Для примера возьмем веб-сервис «Currency Exchange Rate» от xmethods.com. Адрес этого веб-сервиса, который позволяет получать курсы валют в режиме онлайн — www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl.

    Второй важный момент – из описания веб-сервиса необходимо получить информацию о том, какие методы этот сервис предоставляет, и какие параметры мы должны передавать ему в качестве входных значений (очень похоже на вызов обычной функции php или метода класса). Обычно эта информация содержится в описании сервиса на его сайте. Наш веб-сервис для получения курса валют предоставляет метод getRate(), которому в качестве аргументов передаются коды валют.

    И последнее – важно знать, что ожидать в качестве ответа: сколько значений, какого типа и т.п. Это также можно получить из описания.
    А в результате код получается очень простым и компактным, почти элементарным:

    <?php
    // Использование Web-сервиса
    // "Currency Exchange Rate" от xmethods.com

    // Создание SOAP-клиента по WSDL-документу
    $client = new SoapClient("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");

    // Поcылка SOAP-запроса и получение результата
    $result = $client->getRate("us", "russia");

    echo ‘Текущий курс доллара: ’, $result, ‘ рублей’;
    ?>


    Как видно из кода в конструктор класса SoapClient необходимо передать URL WSDL-документа и получить объект для работы с нужным веб-сервисом. Затем вызывается метод этого объекта, имя которого совпадает с именем самого метода веб-сервиса. Возвращает же этот метод желаемый нами результат.

    Итак, этот простой пример иллюстрирует нам принцип построения SOAP-клиента для веб-сервисов на php. Однако в реальном приложении еще о многом придется позаботиться, в частности о том, что в момент обращения к веб-сервису он может быть временно недоступен или возвращать ошибку. Явно напрашивается использование блока try/catch/throw :)

    Источник: www.scriptz.com.ua/2008/04/19/rabota_s_vebserverami_na_php_posredstvom_soap.html
    Share post

    Comments 23

      –2
      про кат забыли)
      • UFO just landed and posted this here
          0
          вы только забыли осветить один очень важный момент. в PHP пользуясь soap'ом нужно не забывать о кодировании передаваемых переменных. SoapVar в помощь!
            +3
            Not Found

            The requested URL /sd/2001/CurrencyExchangeService.wsdl was not found on this server.

            проверяйте, чтоли, что копируете…
            сервис переехал => www.freewebs.com/jimmy_cheng/CurrencyExchangeService.wsdl
              +1
              Эх… Клевая штука этот SOAP. Спасибо за статью :-)
                –1
                Адрес этого веб-сервиса, который позволяет получать курсы валют в режиме онлайн — www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl

                Ссылка битая
                  +1
                  Старая-добрая phpclub.ru/detail/article/soap по моему намного полезнее и практичнее будет.
                    –4
                    Сталкивался с некоторыми граблями на серверах когда делал SOAP сервисы (php5 -> php5), в частности если в php все что не пустое приводится к true, а пустое к false (0, пустая строка и т.д.), в соапе 1 это может вызвать ошибку(сталкивался на некоторых серверах). Надо точно соблюдать типы и значения передаваемых параметров.
                      –1
                      Если кто будет работать с веб-сервисами на основе NTLM Authentication, то могут быть проблемы, решение которых описано в этом примере.
                        0
                        вопрос. У кого получилось на php с ипользованием soap оправить запрос c document style?
                        p.s. с rpc style все хорошо работает.
                          –1
                          Zend_Soap — есть клиент и сервер
                            0
                            В Zend_Soap имхо пока не очень все хорошо. По крайней мере мне клиента для адвордсов через него написать не удалось, пришлось raw soap экстеншн заюзать.
                            –1
                            Кратенько, конечно, но с другой стороны — больше обычно и не нужно.
                            Мне сейчас приходится общаться со службой FedEx посредством SOAP — просто сказка.
                            Раньше это делалось какими-то шаманствами на апплетах.

                            А уж то, что веб-сервис по тому же самому SOAP довольно быстро отдает и большие объемы данных
                            (например, PDF-файл), вообще супер!
                              0
                              > Под windows это делается просто – необходимо дописать (именно дописать, так как эта строка там не просто закомментирована,
                              > она отсутствует вообще) в php.ini:
                              > extension=php_soap.dll
                              Под Линуксом не сложнее, добавить (или раскоментировать)
                              extension=soap.so
                              и перезапустить сервер.
                              Разве, что в разных дистрибутивах php-модули могут не установлены, тогда менеджер пакетов вам в руки
                                +1
                                В заголовке наверное надо исправить: Работа с веб-сервИСами
                                  –5
                                  У SOAP хорошие перспективы, я считаю. :)
                                    –2
                                    хзхз я SOAP ненавижу и люблю REST тем более что у soap'а эти wsdl файлы бывают несколькомеговые, гонять их кешировать. Гемор еще тот.
                                      0
                                      PHP их сам кэширует, достаточно только включить кэширование в конфигурационном файле php.ini

                                      REST и SOAP, отнюдь, не одно и то же. У REST даже спецификации нет.
                                      А вообще для web-сервисов больше, по-моему, подходит xml-rpc — он проще для понимания и легковеснее. Только вот extension для php еще не stable, но у меня нареканий пока не вызвал.
                                        0
                                        я в курсе про кеширование. но с некоторыми вебсервисами это работы не упрощает.
                                        согласен, xml-rpc намного легковеснее.
                                        + soap неудобно дебажить (про trace я конечно тоже в курсе :) )
                                    0
                                    >Не буду останавливаться на вопросе, что такое веб-сервисы и зачем они нужны. В сети очень много статей на эту >тему.

                                    Статей с примерами о том, как получать курс валют посредством SOAP клиента на php еще больше.
                                      +1
                                      клиент — это просто, а вот сервер — гораздо интереснее. Было бы интересно, почитать статью про создания сервера веб-сервиса, организованного на PHP, а также проблемы, которые могут возникнуть в процессе создания
                                        0
                                        Вставлю и свои пять копеек. С веб-сервисами работаю уже около 2-х лет (продакшена). Используем не soap а xml-rpc, благо оно нативно встроено в python.

                                        Основные применения:
                                        * Демон реализующий основной функционал (работа с БД, сессиями и т.п.) и морда на php. Два отдельных проекта, следовательно над реализацией работают две группы параллельно.
                                        * Единая точка входа (например статистика) от разных проектов.

                                        В общем, отношение такое, что вроде по-началу легко функционал пишется, но вот при апдейтах продакшена требуется долго гонять на тестах.
                                          0
                                          Кириллические кавычки («») в коде нужно заменить на обычные ("")

                                          Only users with full accounts can post comments. Log in, please.