目录搜索
文字

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)
  • 类参考

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

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

  • inti4

  • 布尔

  • dateTime.iso8601

  • BASE64

  • 结构(包含值的数组)

  • 数组(包含值数组)

类参考

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

  • $ portint) - 服务器端口

  • $ proxy字符串) - 可选代理

  • $ proxy_portint) - 代理侦听端口

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) - 错误号

  • $ messagestring) - 错误消息

Returns:  XML\_RPC\_Response instance
Return type:  XML\_RPC\_Response
此方法可让您从服务器向客户端发送错误消息。第一个参数是错误号,第二个参数是错误消息。

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

上一篇:下一篇: