©
本文档使用 PHP中文网手册 发布
CodeIgniter的XML-RPC类允许您向其他服务器发送请求,或者设置您自己的XML-RPC服务器来接收请求。
What is XML-RPC?
Using the XML-RPC Class
Explanation
Initializing the Class
Sending XML-RPC Requests
- [Anatomy of a Request](about:blank#anatomy-of-a-request)- [Creating an XML-RPC Server](about:blank#creating-an-xml-rpc-server)- [Processing Server Requests](about:blank#processing-server-requests) - [Notes:](about:blank#notes)
- [Formatting a Response](about:blank#formatting-a-response)- [Sending an Error Response](about:blank#sending-an-error-response)- [Creating Your Own Client and Server](about:blank#creating-your-own-client-and-server) - [The Client](about:blank#the-client) - [The Server](about:blank#the-server) - [Try it!](about:blank#try-it)
- [Using Associative Arrays In a Request Parameter](about:blank#using-associative-arrays-in-a-request-parameter)- [Data Types](about:blank#id2)
类参考
很简单,这是两台计算机使用XML通过互联网进行通信的一种方式。一台我们称之为客户端的计算机向另一台计算机发送XML-RPC 请求,我们将其称为服务器。一旦服务器收到并处理请求,它就会向客户端发回一个响应。
例如,使用MetaWeblog API,XML-RPC客户端(通常是桌面发布工具)将向您的站点上运行的XML-RPC服务器发送请求。此请求可能是发送用于发布的新博客条目,也可能是请求现有条目进行编辑。当XML-RPC服务器收到这个请求时,它将检查它以确定应该调用哪个类/方法来处理请求。一旦处理完毕,服务器将发送回应消息。
有关详细说明,您可以访问XML-RPC站点。
像CodeIgniter中的大多数其他类一样,XML-RPC和XML-RPCS类在您的控制器中使用$ this-> load-> library函数进行初始化:
要加载XML-RPC类,您将使用:
$this->load->library('xmlrpc');
加载后,xml-rpc库对象将可用:$ this-> xmlrpc
要加载XML-RPC服务器类,您将使用:
$this->load->library('xmlrpc');$this->load->library('xmlrpcs');
加载后,xml-rpcs库对象将可用:$ this-> xmlrpcs
注意
在使用XML-RPC服务器类时,您必须加载XML-RPC类和XML-RPC服务器类。
要将请求发送到XML-RPC服务器,您必须指定以下信息:
服务器的URL
您希望调用的服务器上的方法
该请求的数据(在下面解释)。
这是一个简单的例子,它向Ping-o-Matic发送一个简单的Weblogs.com ping
$this->load->library('xmlrpc');$this->xmlrpc->server('http://rpc.pingomatic.com/', 80);$this->xmlrpc->method('weblogUpdates.ping');$request = array('My Photoblog', 'http://www.my-site.com/photoblog/');$this->xmlrpc->request($request);if ( ! $this->xmlrpc->send_request()){ echo $this->xmlrpc->display_error();}
上面的代码初始化XML-RPC类,设置要调用的服务器URL和方法(weblogUpdates.ping)。请求(在这种情况下,您的站点的标题和URL)被放入一个数组中以便运输,并使用request()函数进行编译。最后,发送完整的请求。如果send_request()方法返回false,我们将显示从XML-RPC服务器发回的错误消息。
XML-RPC请求就是您发送到XML-RPC服务器的数据。请求中的每条数据都称为请求参数。上面的例子有两个参数:网站的URL和标题。当XML-RPC服务器收到您的请求时,它将查找它需要的参数。
请求参数必须放置在数组中以便运输,并且每个参数可以是七种数据类型之一(字符串,数字,日期等)。如果你的参数不是字符串,你将不得不在请求数组中包含数据类型。
下面是一个简单的三个参数数组的例子:
$request = array('John', 'Doe', 'www.some-site.com');$this->xmlrpc->request($request);
如果使用字符串以外的数据类型,或者如果您有多种不同的数据类型,则将每个参数放入其自己的数组中,数据类型位于第二个位置:
$request = array( array('John', 'string'), array('Doe', 'string'), array(FALSE, 'boolean'), array(12345, 'int'));$this->xmlrpc->request($request);
下面的数据类型部分有一个完整的数据类型列表。
XML-RPC服务器充当各种流量警察,等待传入的请求并将它们重定向到适当的函数进行处理。
要创建自己的XML-RPC服务器,需要在控制器中初始化希望传入请求出现的XML-RPC服务器类,然后使用映射指令设置数组,以便传入的请求可以发送到相应的类和方法处理。
下面是一个例子来说明:
$this->load->library('xmlrpc');$this->load->library('xmlrpcs');$config['functions']['new_post'] = array('function' => 'My_blog.new_entry');$config['functions']['update_post'] = array('function' => 'My_blog.update_entry');$config['object'] = $this;$this->xmlrpcs->initialize($config);$this->xmlrpcs->serve();
以上示例包含一个指定服务器允许的两个方法请求的数组。允许的方法在数组的左侧。当收到其中任何一个时,它们将被映射到右侧的类和方法。
'object'键是一个特殊的键,它传递一个实例化的类对象,当你映射的方法不是CodeIgniter超级对象的一部分时,这是必需的。
换句话说,如果XML-RPC客户端发送new_post方法的请求,您的服务器将加载My_blog类并调用new_entry函数。如果请求是针对update_post方法的,那么您的服务器将加载My_blog类并调用该update_entry()
方法。
上例中的函数名称是任意的。您将决定在服务器上应该调用哪些应用程序,或者如果您使用的是标准化API(如Blogger或MetaWeblog API),则可以使用它们的函数名称。
在初始化服务器类时可以使用两个额外的配置键:为了启用调试,可以将debug设置为TRUE,并且可以将xss_clean设置为FALSE以阻止通过安全库的xss_clean()
方法发送数据。
当XML-RPC服务器接收到一个请求并加载类/方法进行处理时,它会将一个对象传递给包含客户端发送数据的方法。
使用上面的例子,如果请求new_post方法,服务器将期望一个类存在于这个原型中:
class My_blog extends CI_Controller { public function new_post($request) { }}
$ request变量是服务器编译的一个对象,它包含由XML-RPC客户端发送的数据。使用这个对象,你将有权访问请求参数,使你能够处理请求。完成后,您将向客户发送回应。
以下是使用Blogger API的真实示例。Blogger API中的一种方法是getUserInfo()
。使用这种方法,XML-RPC客户端可以向服务器发送一个用户名和密码,作为回报,服务器返回关于该特定用户的信息(昵称,用户ID,电子邮件地址等)。以下是处理函数的外观:
class My_blog extends CI_Controller { public function getUserInfo($request) { $username = 'smitty'; $password = 'secretsmittypass'; $this->load->library('xmlrpc'); $parameters = $request->output_parameters(); if ($parameters[1] != $username && $parameters[2] != $password) { return $this->xmlrpc->send_error_message('100', 'Invalid Access'); } $response = array( array( 'nickname' => array('Smitty', 'string'), 'userid' => array('99', 'string'), 'url' => array('http://yoursite.com', 'string'), 'email' => array('[email protected]', 'string'), 'lastname' => array('Smith', 'string'), 'firstname' => array('John', 'string') ), 'struct' ); return $this->xmlrpc->send_response($response); }}
该output_parameters()
方法检索与客户端发送的请求参数相对应的索引数组。在上面的例子中,输出参数将是用户名和密码。
如果客户端发送的用户名和密码无效,并且使用返回错误消息send_error_message()
。
如果操作成功,客户端将返回一个包含用户信息的响应数组。
与请求类似,响应必须被格式化为一个数组。但是,与请求不同,响应是包含单个项目的数组。该项可以是一个包含多个附加数组的数组,但只能有一个主数组索引。换句话说,基本原型是这样的:
$response = array('Response data', 'array');
但是,回复通常包含多条信息。为了实现这一点,我们必须将响应放入其自己的数组中,以便主数组继续包含单个数据。这里有一个例子显示了这可能是如何实现的:
$response = array( array( 'first_name' => array('John', 'string'), 'last_name' => array('Doe', 'string'), 'member_id' => array(123435, 'int'), 'todo_list' => array(array('clean house', 'call mom', 'water plants'), 'array'), ), 'struct');
注意上面的数组被格式化为一个结构体。这是响应最常用的数据类型。
与请求一样,响应可以是“数据类型”部分中列出的七种数据类型之一。
如果您需要向客户端发送错误响应,您将使用以下内容:
return $this->xmlrpc->send_error_message('123', 'Requested data not available');
第一个参数是错误号,而第二个参数是错误消息。
为了帮助您了解迄今为止所介绍的所有内容,我们创建一个用作XML-RPC客户端和服务器的控制器。您将使用客户端向服务器发送请求并接收响应。
使用文本编辑器创建一个名为Xmlrpc_client.php的控制器。在它中,放置这些代码并将其保存到您的应用程序/控制器/文件夹中:
<?phpclass Xmlrpc_client extends CI_Controller { public function index() { $this->load->helper('url'); $server_url = site_url('xmlrpc_server'); $this->load->library('xmlrpc'); $this->xmlrpc->server($server_url, 80); $this->xmlrpc->method('Greetings'); $request = array('How is it going?'); $this->xmlrpc->request($request); if ( ! $this->xmlrpc->send_request()) { echo $this->xmlrpc->display_error(); } else { echo '<pre>'; print_r($this->xmlrpc->display_response()); echo '</pre>'; } }}?>
注意
在上面的代码中,我们使用了“url助手”。您可以在帮助者功能页面找到更多信息。
使用文本编辑器创建一个名为Xmlrpc_server.php的控制器。在它中,放置这些代码并将其保存到您的应用程序/控制器/文件夹中:
<?phpclass Xmlrpc_server extends CI_Controller { public function index() { $this->load->library('xmlrpc'); $this->load->library('xmlrpcs'); $config['functions']['Greetings'] = array('function' => 'Xmlrpc_server.process'); $this->xmlrpcs->initialize($config); $this->xmlrpcs->serve(); } public function process($request) { $parameters = $request->output_parameters(); $response = array( array( 'you_said' => $parameters[0], 'i_respond' => 'Not bad at all.' ), 'struct' ); return $this->xmlrpc->send_response($response); }}
现在使用类似下面的网址访问您的网站:
example.com/index.php/xmlrpc_client/
您现在应该看到您发送给服务器的消息,并将其响应回复给您。
您创建的客户端会向服务器发送一条消息(“该怎么回事?”)以及“Greetings”方法的请求。服务器接收请求并将其映射到process()
发送响应的方法。
如果你想在你的方法参数中使用关联数组,你将需要使用一个struct数据类型:
$request = array( array( // Param 0 array('name' => 'John'), 'struct' ), array( // Param 1 array( 'size' => 'large', 'shape'=>'round' ), 'struct' ));$this->xmlrpc->request($request);
在服务器中处理请求时,您可以检索关联数组。
$parameters = $request->output_parameters();$name = $parameters[0]['name'];$size = $parameters[1]['size'];$shape = $parameters[1]['shape'];
根据XML-RPC规范,您可以通过XML-RPC发送七种类型的值:
int或i4
布尔
串
双
dateTime.iso8601
BASE64
结构(包含值的数组)
数组(包含值数组)
class CI_Xmlrpcinitialize([$config = array()])
参数: | $ config(array) - 配置数据 |
---|---|
返回类型: | void |
$ config(array) - 配置数据
Return type: void
初始化XML-RPC库。接受包含您的设置的关联数组。
server($url[, $port = 80[, $proxy = FALSE[, $proxy_port = 8080]]])
参数: | $ url(string) - XML-RPC服务器URL $ port(int) - 服务器端口$ proxy(字符串) - 可选代理$ proxy_port(int) - 代理侦听端口 |
---|---|
返回类型: | void |
$ url(字符串) - XML-RPC服务器URL
$ port(int) - 服务器端口
$ proxy(字符串) - 可选代理
$ proxy_port(int) - 代理侦听端口
Return type: void
设置请求发送到的服务器的URL和端口号:
$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);
基本的HTTP身份验证也被支持,只需将其添加到服务器URL即可:
$this->xmlrpc->server('http://user:[email protected]/', 80);
timeout($seconds = 5)
参数: | $ seconds(int) - 以秒为单位的超时 |
---|---|
返回类型: | 空虚 |
$ seconds(int) - 以秒为单位的超时
Return type: void
设置超时期限(以秒为单位),之后请求将被取消:
$this->xmlrpc->timeout(6);
这个超时时间将用于初始连接到远程服务器,以及从中获取响应。确保您在调用之前设置超时send_request()
。
method($function)
参数: | $ function(string) - 方法名称 |
---|---|
返回类型: | void |
$ function(string) - 方法名称
Return type: void
设置将从XML-RPC服务器请求的方法:
$this->xmlrpc->method('method');
方法是方法的名称。
request($incoming)
参数: | $ incoming(array) - 请求数据 |
---|---|
返回类型: | void |
$ incoming(array) - 请求数据
Return type: void
获取一组数据并构建发送到XML-RPC服务器的请求:
$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/'); $this->xmlrpc->request($request);
send_request()
返回: | 成功为TRUE,失败为FALSE |
---|---|
返回类型: | 布尔 |
display_error()
返回: | 错误消息字符串 |
---|---|
返回类型: | 串 |
display_response()
返回: | 响应 |
---|---|
返回类型: | mixed |
send_error_message($number, $message)
参数: | $ number(int) - 错误号$ message(string) - 错误消息 |
---|---|
返回: | XML_RPC_Response实例 |
返回类型: | XML_RPC_Response |
$ number(int) - 错误号
$ message(string) - 错误消息
Returns: XML\_RPC\_Response instance
Return type: XML\_RPC\_Response
此方法可让您从服务器向客户端发送错误消息。第一个参数是错误号,第二个参数是错误消息。
返回$ this-> xmlrpc-> send_error_message(123,'请求的数据不可用');