XML-RPC and XML-RPC Server Classes

XML-RPC and XML-RPC Server Classes

CodeIgniter的XML-RPC类允许您向其他服务器发送请求,或者设置您自己的XML-RPC服务器来接收请求。

  • What is XML-RPC?

- [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)

  • 类参考

What is XML-RPC?

很简单,这是两台计算机使用XML通过互联网进行通信的一种方式。一台我们称之为客户端的计算机向另一台计算机发送XML-RPC 请求,我们将其称为服务器。一旦服务器收到并处理请求,它就会向客户端发回一个响应

例如,使用MetaWeblog API,XML-RPC客户端(通常是桌面发布工具)将向您的站点上运行的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请求

要将请求发送到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服务器,需要在控制器中初始化希望传入请求出现的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的控制器。在它中,放置这些代码并将其保存到您的应用程序/控制器/文件夹中:

<?php class 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的控制器。在它中,放置这些代码并将其保存到您的应用程序/控制器/文件夹中:

<?php class 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发送七种类型的值:

  • inti4

类参考

class CI_Xmlrpcinitialize([$config = array()])

参数:$ config(array) - 配置数据
返回类型:void

  • $ configarray) - 配置数据

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

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) - 以秒为单位的超时
返回类型:空虚

  • $ secondsint) - 以秒为单位的超时

Return type: void

设置超时期限(以秒为单位),之后请求将被取消:

$this->xmlrpc->timeout(6

这个超时时间将用于初始连接到远程服务器,以及从中获取响应。确保您在调用之前设置超时send_request()

method($function)

参数:$ function(string) - 方法名称
返回类型:void

  • $ functionstring) - 方法名称

Return type: void

设置将从XML-RPC服务器请求的方法:

$this->xmlrpc->method('method'

方法是方法的名称。

request($incoming)

参数:$ incoming(array) - 请求数据
返回类型:void

  • $ incomingarray) - 请求数据

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

  • $ numberint) - 错误号

Returns: XML\_RPC\_Response instance

Return type: XML\_RPC\_Response

此方法可让您从服务器向客户端发送错误消息。第一个参数是错误号,第二个参数是错误消息。

返回$ this-> xmlrpc-> send_error_message(123,'请求的数据不可用');