Использование Zend_XmlRpc_Client очень похоже на
использование объектов SoapClient
(расширение SOAP).
Вы можете легко вызывать процедуры XML-RPC как
методы Zend_XmlRpc_Client.
Задавайте полный адрес сервиса в конструкторе Zend_XmlRpc_Client.
Пример 18.1. Основной запрос XML-RPC
<?php
/**
* Соединение с сервером framework.zend.com server и вывод массива
* доступных методов.
*/
require_once 'Zend/XmlRpc/Client.php';
$server = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
print_r( $server->system->listMethods() );
?>
![]() |
Замечание |
|---|---|
Zend_XmlRpc_Client пытается сделать удаленные методы
по возможности похожими на "родные" методы. Если удаленный
метод содержит пространства имен, как, например,
system.listMethods(), то вызов осуществляется
с использованием "цепочки объектов" в PHP:
$server->system->listMethods().
|
Некоторые процедуры сервиса XML-RPC требуют передачи параметров.
Необходимые параметры передаются как параметры метода
Zend_XmlRpc_Client. Параметры процедуры XML-RPC
должны иметь специальный тип XML-RPC. Параметры могут передаваться
2 способами: как "родные" для PHP или как объекты
Zend_XmlRpc_Value, которые представляют типы XML-RPC.
Параметры, передаваемые как переменные PHP, могут быть строками, целыми числами, числами с плавающей точкой, булевыми значениями, массивами или объектами. В этом случае "родной" тип PHP будет автоматически определен и преобразован в один из типов XML-RPC в соответствии с таблицей ниже:
Таблица 18.1. Преобразование типов PHP и XML-RPC
| Тип PHP | Тип XML-RPC |
|---|---|
| integer | int |
| double | double |
| boolean | boolean |
| string | string |
| array | array |
| associative array | struct |
| object | array |
<?php
/** Этой процедуре передается 2 параметра:
* - Первый параметр является строкой, которая будет автоматически преобразована в строку XML-RPC
* - Второй параметр -- ассоциативный массив, кторорый будет преобразован в структуру XML-RPC
*/
$p1 = 'parameter 1';
$p2 = array('name' => 'Joe', 'age' => 30);
$service->serviceProcedure($p1, $p2);
?>
Параметры передаются как объекты Zend_XmlRpc_Value.
Вы можете создавать один из экземпляров Zend_XmlRpc_Value
для указания точного типа XML-RPC ваших параметров.
Основными причинами для точного задания типов XML-RPC являются
случаи:
Есть два способа создать объект Zend_XmlRpc_Value:
явный способ (вызов конструктора объекта) и
использование статической функции Zend_XmlRpc_Value::getXmlRpcValue()
с константой, обозначающей требуемый тип XML-RPC.
Таблица 18.2. Представление типов XML-RPC объектами Zend_XmlRpc_Value
| Тип XML-RPC | Соответствующая константа Zend_XmlRpc_Value
|
Объект Zend_XmlRpc_Value
|
|---|---|---|
| int | Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER |
Zend_XmlRpc_Value_Integer |
| double | Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE |
Zend_XmlRpc_Value_Double |
| boolean | Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN |
Zend_XmlRpc_Value_Boolean |
| string | Zend_XmlRpc_Value::XMLRPC_TYPE_STRING |
Zend_XmlRpc_Value_String |
| base64 | Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64 |
Zend_XmlRpc_Value_Base64 |
| dateTime.iso8601 | Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME |
Zend_XmlRpc_Value_DateTime |
| array | Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY |
Zend_XmlRpc_Value_Array |
| struct | Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT |
Zend_XmlRpc_Value_Struct |
<?php
/** Процедуре передается 2 параметра:
* - Первый параметр имеет тип XML-RPC base64, который создается с помощью
* статической функции Zend_XmlRpc_Value::getXmlRpcValue().
* - Второй параметр является структурой XML-RPC, которая создается явно.
*/
$p1 = Zend_XmlRpc_Value::getXmlRpcValue('encoded string', Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64);
$p2 = new Zend_XmlRpc_Value_Struct(array('name' => 'Joe', 'age' => 30));
$service->serviceProcedure($p1, $p2);
?>
![]() |
Замечание |
|---|---|
Значения параметров по-прежнему даются в виде переменных PHP,
но они будут преобразованы в указанный тип с использованием
преобразований средствами PHP (т.е. если строка дана как
значение для объекта Zend_XmlRpc_Value_Integer,
то она будет преобразована с помощью (int)$value).
|
Этот метод передачи параметров используется внутри пакета
Zend_XmlRpc и не рекомендуется для использования.
Если вам все равно нужен этот метод, то вы должны
использовать статическую функцию Zend_XmlRpc_Value::getXmlRpcValue()
для разбора строки XML в объект Zend_XmlRpc_Value,
который представляет собой надлежащий тип XML-RPC.
Функция Zend_XmlRpc_Value::getXmlRpcValue()
должна получать 2 параметра: строку XML и константу
Zend_XmlRpc_Value::XML_STRING.
Основное различие между XML-RPC и веб-сервисами SOAP заключается в файле WSDL. Протокол SOAP обычно имеет файл WSDL, который описывает интерфейс веб-сервиса. По этому интерфейсу клиент SOAP знает, параметры каких типов он должен отправить серверу и типы возвращаемых значений. Без файла WSDL могут быть проблемы с узнаванием этих типов.
Решение протокола XML-RPC заключается в использовании специальной
процедуры сервиса, называемой system.methodSignature.
Эта процедура получает имя процедуры в качестве параметра
и возвращает сигнатуру данной процедуры. Сигнатурой является
типы необходимых параметров и тип возвращаемого значения.
![]() |
Замечание |
|---|---|
Не все сервера XML-RPC поддерживают специальную процедуру
system.methodSignature, сервера, которые не поддерживают ее,
не могут поддерживать и приведение типов.
|
Zend_XmlRpc_Client реализует что-то вроде файлов
типа 'WSDL' для серверов XML-RPC, используя процедуру
system.methodSignature.
По требованию Zend_XmlRpc_Client будет запрашивать
список всех процедур сервера XML-RPC, все сигнатуры
этих процедур и сохранять все эти данные в файле XML (подобие
файла SOAP WSDL).
Когда опять используется тот же сервер XML-RPC, пользователь может
предоставить этот файл XML и Zend_XmlRpc_Client произведет
приведение типов всех параметров для запрошенных процедур
в соответствии с их сигнатурами.
XML-файл сигнатур процедур создается вызовом функции
Zend_XmlRpc_Client::__getMethodsXml() (функция возвращает
строку XML, содержащую все данные сигнатур). Для того, чтобы
установить существующий XML-файл сигнатур, пользователь может
передавать данные XML в качестве параметра в конструкторе
Zend_XmlRpc_Client или вызывать функцию
Zend_XmlRpc_Client::__setMethodsXml().
Пример 18.2. Вызов сервиса XML-RPC с приведением типов
<?php
/**
* Соединение с сервером XML-RPC и сохранение его сигнатур в файле
* (эквивалент файлу SOAP WSDL, предоставляемый XML-RPC)
*/
require_once 'Zend/XmlRpc/Client.php';
$service = new Zend_XmlRpc_Client('http://www.example.org/xmlrpc');
file_put_contents('/tmp/xmlrpc-signatures/example.xml', $service->__getMethodsXml());
/* Объект $service содержит все сигнатуры сервера XML-RPC,
когда вызывается serviceProcedure, его параметр ($param) преобразуется
к нужному типу в соответствии с сигнатурой процедуры.
*/
$service->serviceProcedure($param);
?>
<?php
/**
* Соединение с сервером XML-RPC с использованием существующего файла сигнатур,
* удостоверяемся, что типы параметров, передаваемых процедурам, имеют необходимый тип.
*/
require_once 'Zend/XmlRpc/Client.php';
$signature_file_xml = file_get_contents('/tmp/xmlrpc-signatures/example.xml');
$service = new Zend_XmlRpc_Client('http://www.example.org/xmlrpc', 'namespace', $signature_file_xml);
/* Объект $service содержит все сигнатуры сервера XML-RPC,
когда вызывается serviceProcedure, его параметр($param) преобразуется
к нужному типу в соответствии с сигнатурой процедуры.
*/
$service->serviceProcedure($param);
?>
Процедура XML-RPC возвращает значение, имеющее тип XML-RPC.
Метод Zend_XmlRpc_Client, который вызывает
процедуру XML-RPC, возвращает "родной" тип PHP, который
преобразуется из возвращенного типа XML-RPC.
Вы можете использовать функцию Zend_XmlRpc_Client::__getResponse(),
чтобы получить значение, возвращенное запрошенной процедурой.
Функция __getResponse() получает параметр, который
показывает тип возвращаемого значения.
Опции ответа:
Zend_XmlRpc_Client::RESPONSE_PHP_NATIVE -
Вернуть возвращаемое значение процедуры как "родной" тип PHP
(преобразовать тип XML-RPC в тип PHP).
Zend_XmlRpc_Client::RESPONSE_XML_STRING -
Вернуть строку XML, представляющую ответ XML-RPC.
Zend_XmlRpc_Client::RESPONSE_ZXMLRPC_OBJECT -
Вернуть объект Zend_XmlRpc_Value, который
представляет возвращенный тип XML-RPC.
<?php
$service->serviceProcedure();
$response = $service->__getResponse();
// $response является переменной PHP, преобразованной из возвращенного значения,
// имеющего тип XML-RPC
$response = $service->__getResponse(Zend_XmlRpc_Client::RESPONSE_XML_STRING);
// $response является строкой, содержащей возвращеное процедурой значение
// в представлении XML
$response = $service->__getResponse(Zend_XmlRpc_Client::RESPONSE_ZXMLRPC_OBJECT);
// $response является экземпляром Zend_XmlRpc_Value, представляющим возвращенный
// тип XML-RPC
?>