Разработчику. Сборник рецептов PHP
Задавайте вопросы

Посылка SOAP-запросов

Вернуться назад

Задача

Необходимо послать SOAP-запрос. Создание SOAP-клиентов позволяет собирать информацию с SOAP-серверов независимо от их операционных систем и связующего программного обеспечения.

Решение

Применяем SOAP-классы PEAR. Ниже показана клиентская программа, использующая SOAP-сервис GoogleSearch:

require 'SOAP/Client.php';

$query = 'php'; // ваши условия поиска в Google
$soap = new SOAP_Client('http://api.google.com/search/beta2');

$params = array(
                    new SOAP_Value('key', 'string', 'your google key'),
                    new SOAP_Value('q', 'string', $query),
                    new SOAP_Value('start', 'int', 0),
                    new SOAP_Value('maxResults', 'int', 10),
                    new SOAP_Value('filter', 'boolean', false),
                    new SOAP_Value('restrict', 'string', ''),
                    new SOAP_Value('safeSearch', 'boolean', false),
                    new SOAP_Value('lr', 'string', 'lang_en'),
                    new SOAP_Value('ie', 'string', ''),
                    new SOAP_Value('oe', 'string', ''));

$hits = $soap->call('doGoogleSearch', $params, 'urn:GoogleSearch');

foreach ($hits->resultElements as $hit) {
printf('<a href="%s">%s</a><br />', $hit->URL, $hit->title);
}

Обсуждение

Простой протокол доступа к объектам Simple Object Access Protocol, SOAP) – это способ обмена информацией, подобно XML-RPC реализованный поверх протокола HTTP. В качестве формата сообщений он также использует XML, что облегчает процесс их создания и анализа. В результате, так как SOAP не зависит от платформы и языка, он доступен на многих платформах и во многих языках, включая PHP. Чтобы сделать SOAP-запрос, нужно создать новый объект SOAP_Client и передать конструктору адрес страницы, на которую посылается этот запрос:

$soap = new SOAP_Client('http://api.google.com/search/beta2');

В настоящее время поддерживается два различных метода взаимодействия: HTTP и SMTP. Допускается также защищенный режим HTTP,если в вашей версии PHP встроен SSL. Для выбора используемого метода укажите его в качестве префикса вашего URL (http, https или mailto).

После создания объекта SOAP_Client используйте его метод call() для вызова удаленной функции:

$query = 'php';

$params = array(
              new SOAP_Value('key', 'string', 'your google key'),
              new SOAP_Value('q', 'string', $query),
              new SOAP_Value('start', 'int', 0),
              new SOAP_Value('maxResults', 'int', 10),
              new SOAP_Value('filter', 'boolean', false),
              new SOAP_Value('restrict', 'string', ''),
              new SOAP_Value('safeSearch', 'boolean', false),
              new SOAP_Value('lr', 'string', 'lang_en'),
              new SOAP_Value('ie', 'string', ''),
              new SOAP_Value('oe', 'string', ''));

$hits = $soap->call('doGoogleSearch', $params, 'urn:GoogleSearch');

Массив $params содержит совокупность объектов SOAP_Value. Объект SOAP_Value создается с тремя аргументами: именем, типом и значением параметра, которое передается SOAP-серверу. Они меняются от сообщения к сообщению в зависимости от SOAP-функции, доступной на сервере.

Реальные события происходят в методе SOAP_Client::call(), который принимает несколько аргументов. Первый – это метод, который должен выполнить сервер; в данном случае это doGoogleSearch. Второй аргумент – это массив параметров, передаваемых функции на SOAP-сервере. Третий аргумент, urn:GoogleSearch,– это пространство имен SOAP; он позволяет серверу узнать, что doGoogleSearch принадлежит к пространству имен GoogleSearch. С помощью пространства имен разрешается возможный конфликт между одноименными методами.

Есть и четвертый параметр, не используемый в данном случае – soapAction. Этот параметр можно добавить, если требуется сообщить SOAP-серверу URI, представляющий цель запроса. К сожалению, определение слова «intent» трактуется от реализации к реализации по-разному. В данный момент действует соглашение о том, чтобы не использовать soapAction без дальнейшего его уточнения. SOAP-сервер PEAR не использует это поле, но другие поставщики услуг могут присвоить ему свое собственное значение.

В случае успешного выполнения функция возвращает объект, содержащий ответ сервера. При возникновении ошибки функция возвращает объект PEAR_Error. Google возвращает информацию разных типов, но в данном случае мы выполняем цикл по массиву $resultElements и извлекаем для вывода URL и название каждой найденной ссылки:

foreach ($hits->resultElements as $hit) {
        printf('<a href="%s">%s</a><br />', $hit->URL, $hit->title);
}

В результате получим:

<a href="http://www.php.net/"><b>PHP</b>: Hypertext Preprocessor</a>
<a href="http://www.php.net/downloads.php"><b>PHP</b>: Downloads</a>
<a href="http://phpnuke.org/"><b>PHP</b>-Nuke</a>
<a href="http://www.phpbuilder.com/">PHPBuilder.com</a>
<a href="http://php.resourceindex.com/">The <b>PHP</b> Resource Index</a>
<a href="http://www.php.com/"><b>PHP</b>.com: Home</a>
<a href="http://www.php.org/"><b>PHP</b>.org</a>
<a href="http://php.weblogs.com/"><b>PHP</b> Everywhere:</a>
<a href="http://www.php3.org/"></a>
<a href="http://gtk.php.net/"><b>PHP</b>-GTK</a>

Для выполнения запросов можно также использовать язык определения веб-сервисов (WSDL, Web Services Definition Language). При использовании WSDL нет необходимости перечислять ключи параметров или пространство имен SOAP:

require 'SOAP/Client.php';

$wsdl_url = 'http://api.google.com/GoogleSearch.wsdl';
$WSDL = new SOAP_WSDL($wsdl_url);
$soap = $WSDL->getProxy();

$hits = $soap->doGoogleSearch('your google key',$query,0,10,
                    true,'',false,'lang_en','','');

Этот код эквивалентен самому длинному предыдущему примеру. Объект SOAP_WSDL принимает URL для WSDL-файла GoogleSearch и автоматически загружает спецификацию с этого URL. Вместо создания и присвоения переменной $soap нового объекта SOAP_Client вызывается метод SOAP_WSDL::getProxy(), создающий объект GoogleSearch.

Этот новый объект имеет методы с теми же именами, что и имена SOAP-методов GoogleSearch. Поэтому, вместо того чтобы передавать doGoogleSearch функции SOAP_Client::call() в качестве первого параметра, мы вызываем метод $soap->doGoogleSearch(). Значения массива $params становятся аргументами метода, при этом нет необходимости в инкапсуляции массива или создании объектов SOAP_Value. Кроме того, поскольку объект находится в WSDL-файле, то нет необходимости в указании пространства имен.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ