目录 搜索
Array Array Helper Benchmarking Benchmarking Class Caching Caching Driver Calendaring Calendaring Class CAPTCHA CAPTCHA Helper Config Config Class Cookie Cookie Helper Database Connecting to your Database Custom Function Calls Database Caching Class Database Configuration Database Forge Class Database Metadata Database Quick Start: Example Code Database Reference Database Utility Class DB Driver Reference Generating Query Results Queries Query Builder Class Query Helper Methods Transactions Date Date Helper Directory Directory Helper Download Download Helper Email Email Class Email Helper Encrypt Encrypt Class Encryption Encryption Library File File Helper File Uploading File Uploading Class Form Form Helper Form Validation Form Validation FTP FTP Class Functions compatibility_functions common_functions HTML HTML Helper HTML Table HTML Table Class Image Manipulation Image Manipulation Class Inflector Inflector Helper Input Input Class Javascript Javascript Class Language Language Class Language Helper Loader Loader Class Migrations Migrations Class Number Number Helper Output Output Class Pagination Pagination Class Path Path Helper Security Security Class Security Helper Session Session Library Shopping Cart Shopping Cart Class Smiley Smiley Helper String String Helper Template Parser Template Parser Class Text Text Helper Trackback Trackback Class Typography Typography Class Typography Helper Unit Testing Unit Testing Class URI URL User Agent XML XML-RPC and XML-RPC Server Zip Encoding Zip Encoding Class XML-RPC and XML-RPC Server Classes XML Helper User Agent Class URL Helper URI Class
文字

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,'请求的数据不可用');

上一篇: 下一篇: