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

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

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

Задача

Вы хотите быть XML-RPC-клиентом и посылать запросы на сервер. XML-RPC позволяет PHP осуществлять вызовы функций на веб-сервере, даже если они не используют PHP. Затем полученные данные автоматически конвертируются в переменные PHP для использования в вашем приложении.

Решение

Используйте встроенное в PHP расширение ML-RPC с некоторыми вспомогательными функциями. Что касается версии PHP 4.1, то она поставляется с расширением xmlrpc-epi. К сожалению, расширение xmlrpc-epi не имеет «родных» C-функций, принимающих форматированную строку XML-RPC и посылающих запрос. Единственным используемым в данном случае файлом является файл utils.php, который располагается в каталоге sample/utils. Для инсталляции этого файла просто скопируйте его в каталог, входящий в include_path, чтобы PHP смог найти этот файл.

Ниже приведен код клиентской программы, вызывающий функцию на сервере XML-RPC, который возвращает названия штатов:

// это имя файла по умолчанию из пакета, хранящееся
// здесь, чтобы избежать путаницы в имени файла
require 'utils.php';

// параметры сервера
$host = 'betty.userland.com';
$port = 80;
$uri = '/RPC2';

// параметры запроса:
// передаем число из диапазона 1-50.
// в ответ получаем n-й штат в алфавитном порядке,
// где 1 это Alabama, 50 это Wyoming и т.п.
$method = 'examples.getStateName';
$args = array(32); // передаваемые данные

// строим из этих переменных массив
$request = compact('host', 'port', 'uri', 'method', 'args');

// эта функция создает соответствующий XML-RPC запрос
$result = xu_rpc_http_concise($request);

print "I love $result!\n";

Обсуждение

XML-RPC – формат, созданный фирмой Userland Software, позволяет посылать запросы веб-серверу с помощью протокола HTTP. Сам запрос представляет собой ML-документ, отформатированный особым образом. В качестве клиента вы строите посылаемый XML-запрос, который должен удовлетворять спецификации XML-RPC. Затем вы посылаете его на сервер, а сервер отвечает вам XML-документом. Для извлечения результатов необходимо проанализировать полученный XML-документ. Сервер XML-RPC в разделе «Решение» возвращает название штата, поэтому программа печатает:

love New York!

В отличие от более ранних реализаций XML-RPC, которые были запрограммированы на PHP, текущая версия встроенного расширения аписана на C, и обработка с ее помощью выполняется значительно быстрее. Чтобы подключить это расширение, добавьте при конфигурировании PHP параметр --with-xmlrpc.

Параметры сервера указывают PHP, какому серверу посылать запрос. Переменная $host – это имя хоста сервера; переменная $port обозначает порт, через который работает веб-сервер, обычно это порт с номером 80; переменная $uri – это относительный путь к серверу XML-RPC, с которым нужно соединиться. Если порт не указан, функция по умолчанию обращается к порту 80, а в качестве URI по умолчанию берется корневой каталог веб-сервера /.

Параметрами запроса являются имя вызываемой функции и данные, которые ей передаются. Так, метод examples.getStateName принимает целое число из диапазона от 1 до 50 и возвращает соответствующее название американского штата в алфавитном порядке. В XML-RPC имена методов могут включать точку, а в PHP нет. Если бы это было так, то PHP-эквивалентом передачи числа 32 в качестве аргумента при вызове метода XML-RPC examples.getStateName был бы вызов функции examples.getStateName():

examples.getStateName(32);

В XML-RPC это выглядит следующим образом:

<?xml version='1.0' encoding="iso-8859-1" ?>
<methodCall>
<methodName>examples.getStateName</methodName>
     <params>
          <param>
               <value>
                    <int>32</int>
                    </value>
</param>
          </params>
</methodCall>

Параметры сервера и информация запроса заносятся в единый ассоциативный массив, который передается функции xu_rpc_http_concise().Для сокращения записи выполняется вызов функции compact(), который идентичен следующему:

$request = array('host' => $host,
               'port' => $port,
               'uri' => $uri,
               'method' => $method,
               'args' => $args);

Функция xu_rpc_http_concise() выполняет вызов XML-RPC и возвращает результаты. Поскольку возвращенное значение является строкой, можно непосредственно вывести переменную $results. Если же наш XML-RPC-вызов возвращает множество значений, то функция xu_rpc_http_concise() также возвращает массив.

В массиве, передаваемом функции u_rpc_http_concise(), может быть до 10 различных параметров, но только один из них обязателен – host. Эти параметры приведены в табл. 12.1.

Таблица 12.1. Параметры функции xu_rpc_http_concise()

Имя Описание
host Имя хоста сервера
uri URI сервера (по умолчанию /)
port Порт сервера (по умолчанию 80)
method Имя вызываемого метода
args Аргументы, передаваемые методу
debug Уровень отладки (от 0 до 2; 0 – выключена, 2 – наибольший)
timeout Ограничение времени выполнения запроса в секундах; значение 0 – нет ограничений
user Имя пользователя для базовой аутентификации HTTP, если необходимо
pass Пароль для базовой аутентификации, если необходимо
secure Для шифрования посылок используется защищенное соединение SSL; требует сборки PHP с поддержкой SSL (при указании требуется передать любое истинное значение)

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

Рейтинг@Mail.ru

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

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

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