Посылка 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('%s
', $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. С помощью пространства имен разрешается возможный конфликт между одноименными методами.

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

В случае успешного выполнения функция возвращает объект, содержащий ответ сервера.


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

foreach ($hits->resultElements as $hit) {
printf('%s
', $hit->URL, $hit->title);
}

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

(a href="http://www.php.net/">PHP: Hypertext Preprocessor(/a)
(a href="http://www.php.net/downloads.php">PHP: Downloads(/a)
(a href="http://phpnuke.org/">PHP-Nuke(/a)
(a href="http://www.phpbuilder.com/">PHPBuilder.com(/a)
(a href="http://php.resourceindex.com/">The PHP Resource Index(/a)
(a href="http://www.php.com/">PHP.com: Home(/a)
(a href="http://www.php.org/">PHP.org(/a)
(a href="http://php.weblogs.com/">PHP Everywhere:(/a)
(a href="http://www.php3.org/">(/a)
(a href="http://gtk.php.net/">PHP-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-файле, то нет необходимости в указании пространства имен.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ XML с помощью DOM
Анализ XML с помощью SAX
Генерация XML вручную
Генерация XML с применением DOM
Обмен данными с помощью WDDX

Вернуться в раздел: PHP / 12. XML