Zend_XmlRpc_Client介绍
Zend Framework 通过 方法调用
使用 XML-RPC 客户端调用远程方法,需要实例化它并且使用 Example #1 XML-RPC 方法调用 require_once 'Zend/XmlRpc/Client.php'; $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc'); echo $client->call('test.sayHello'); // hello
从远程调用返回的 XML-RPC 值将会自动编排和转换为等价的 PHP 原始类型。
在上面的例子中,一个 PHP
Example #2 XML-RPC 带参数的方法调用 require_once 'Zend/XmlRpc/Client.php'; $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc'); $arg1 = 1.1; $arg2 = 'foo'; $result = $client->call('test.sayHello', array($arg1, $arg2)); // $result is a native PHP type
如果远程方法不需要任何参数,这个可选参数可以留空或者传递一个空的
类型及转换
一些远程方法调用时需要参数。它们作为数组传递到 PHP 原始类型作为参数
原始 PHP 变量如
|
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 |
Note: 自动转换
当创建新的Zend_XmlRpc_Value
对象时,它的值通过 PHP 类型设置。PHP 类型将会通过 PHP 类型转换到指定的类型。例如, 如果给Zend_XmlRpc_Value_Integer
对象提供一个字符串,它将由(int)$value
转换。
另一个使用 XML-RPC 客户端调用远程方法的途径是使用服务代理。这是一个 PHP 对象代理远程 XML-RPC 名字空间,使其工作方式尽可能的贴近原始的 PHP 对象。
调用 Zend_XmlRpc_Client
实例的 getProxy()
方法实例化一个服务器代理。该方法将返回一个 Zend_XmlRpc_Client_ServerProxy
实例。对服务器代理方法的任何调用将会传递到远程,而参数的传递就如同其他任何
PHP 方法一样。
Example #3 代理默认命名空间
require_once 'Zend/XmlRpc/Client.php'; $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc'); $server = $client->getProxy(); // Proxy the default namespace $hello = $server->test->sayHello(1, 2); // test.Hello(1, 2) returns "hello"
getProxy()
方法接受一个可选参数作为将要代理的远端服务器的命名空间。
如果没有指定这个命名空间,默认的命名空间会被代理。在下面的例子中,命名空间
test
将会被代理。
Example #4 代理任意命名空间
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc'); $test = $client->getProxy('test'); // Proxy the "test" namespace $hello = $test->sayHello(1, 2); // test.Hello(1,2) returns "hello"
若远端服务器支持任意深度嵌套的命名空间,仍然可以通过服务器代理使用。例如,
如果上面的例子有一个方法 test.foo.bar()
,则可以使用
$test->foo->bar()
来调用。
在 XML-RPC 方法中可能出现两种错误:HTTP 错误和 XML-RPC 失败。
Zend_XmlRpc_Client
可以识别并分别检测并捕获它们。
当 HTTP 错误发生时,例如远端 HTTP 服务器返回
404 Not Found
,将会抛出一个
Zend_XmlRpc_Client_HttpException
异常。
Example #5 处理 HTTP 错误
$client = new Zend_XmlRpc_Client('http://foo/404'); try { $client->call('bar', array($arg1, $arg2)); } catch (Zend_XmlRpc_Client_HttpException $e) { // $e->getCode() returns 404 // $e->getMessage() returns "Not Found" }
不论是如何使用 XML-RPC 客户端的,当 HTTP 错误发生时,都会抛出
Zend_XmlRpc_Client_HttpException
异常。
XML-RPC 失败类似于 PHP 异常。它是从 XML-RPC 方法调用返回的,有着指定的类型,
同时具有错误代码和错误消息。XML-RPC 失败的处理方式随着 Zend_XmlRpc_Client
使用方式不同而不同。
当 call()
方法或者服务器代理对象被使用时,XML-RPC
失败会抛出一个 Zend_XmlRpc_Client_FaultException
异常。异常代码和消息会直接映射到原始的 XML-RPC 失败相应的内容上去。
Example #6 处理 XML-RPC 失败
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc'); try { $client->call('badMethod'); } catch (Zend_XmlRpc_Client_FaultException $e) { // $e->getCode() returns 1 // $e->getMessage() returns "Unknown method" }
当请求时使用 call()
方法,会在失败的时候抛出
Zend_XmlRpc_Client_FaultException
异常。可以调用
getLastResponse()
获得包含在 Zend_XmlRpc_Response
对象中的异常。
当请求时使用 doRequest()
方法,则不会抛出异常。将返回一个包含错误信息的
Zend_XmlRpc_Response
对象。可以使用 Zend_XmlRpc_Response
示例的 isFault()
方法检查。
一些 XML-RPC 服务器支持 system.
命名空间下的自省。Zend_XmlRpc_Client
对这些服务器的这种功能特别进行了支持。
调用 Zend_XmlRpcClient
的 getIntrospector()
方法可以获得 Zend_XmlRpc_Client_ServerIntrospection
实例。
通过它可以使用服务器的自省功能。
本质上说,Zend_XmlRpc_Client
实例的 call()
方法创建了请求对象(Zend_XmlRpc_Request
)并将其传递给另一个方法
doRequest()
,doRequest()
方法返回响应对象(Zend_XmlRpc_Response
)。
doRequest()
方法也可直接调用。
Example #7 处理请求作出回应
$client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc'); $request = new Zend_XmlRpc_Request(); $request->setMethod('test.sayHello'); $request->setParams(array('foo', 'bar')); $client->doRequest($request); // $server->getLastRequest() returns instanceof Zend_XmlRpc_Request // $server->getLastResponse() returns instanceof Zend_XmlRpc_Response
无论客户端通过任何方法调用 XML-RPC 方法,如 call()
方法、
doRequest()
方法或者服务器代理,最后一个请求对象以及对应的响应对象总是可以分别调用
getLastRequest()
和 getLastResponse()
获得。
在前面所有的例子中,从未指定 HTTP 客户端。这是因为在使用 Zend_XmlRpc_Client
时会使用默认配置自动创建一个 Zend_Http_Client
实例。
可以在任何时候使用 getHttpClient()
方法获得 HTTP 客户端。
多数情况下默认的 HTTP 客户端已经足够使用。不过仍然可以使用 setHttpClient()
方法设置新的 HTTP 客户端实例。
setHttpClient()
在单元测试时特别有用。在 Zend_Http_Client_Adapter_Test
中测试时可以欺骗远程服务器。阅读 Zend_XmlRpc_Client
的单元测试了解如何这样做。
Introduction |