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发送七种类型的值:
int
或i4
类参考
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
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
) - 错误号
Returns: XML\_RPC\_Response instance
Return type: XML\_RPC\_Response
此方法可让您从服务器向客户端发送错误消息。第一个参数是错误号,第二个参数是错误消息。
返回$ this-> xmlrpc-> send_error_message(123,'请求的数据不可用');