CodeIgniter 的 XML-RPC 類允許你向另一個服務器發(fā)送請求, 或者建立一個你自己的 XML-RPC 服務器來接受請求。
這是一種在兩臺計算機之間使用 XML 通過互聯(lián)網進行通信的簡單方法。 一臺計算機 , 我們稱之為客戶端 , 發(fā)送一個 XML-RPC 請求給另外一臺計算機, 我們稱之為服務器,當服務器收到請求時,對其進行處理然后將結果返回給客戶端。
例如,使用 MetaWeblog API 時,XML-RPC 客戶端(通常是桌面發(fā)布工具) 將會發(fā)送請求到你站點上的 XML-RPC 服務器,這個請求可能是發(fā)布一篇新博客, 或者編輯一篇已有的博客。當 XML-RPC 服務器收到該請求時,它會決定使用 哪個類和方法來處理該請求,請求處理完成后,服務器將發(fā)送一條回復消息。
關于 XML-RPC 的規(guī)范,你可以查看 XML-RPC 的網站。
跟 CodeIgniter 中的其他類一樣,可以在你的控制器中使用 $this->load->library() 方法加載 XML-RPC 類和 XML-RPC 服務器類。
加載 XML-RPC 類如下:
$this->load->library('xmlrpc');
一旦加載,XML-RPC 類就可以像下面這樣使用:
$this->xmlrpc
加載 XML-RPC 服務器類如下:
$this->load->library('xmlrpc');
$this->load->library('xmlrpcs');
一旦加載,XML-RPC 服務器類就可以像下面這樣使用:
$this->xmlrpcs
注解
當使用 XML-RPC 服務器類時,xmlrpc 和 xmlrpcs 都需要加載。
向 XML-RPC 服務器發(fā)送一個請求,你需要指定以下信息:
下面是個基本的例子,向 Ping-o-Matic 發(fā)送一個簡單的 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)。然后通過 request() 方法編譯請求, 例子中請求是一個數(shù)組(標題和你網站的 URL)。最后,使用 send_request() 方法發(fā)送完整的請求。如果發(fā)送請求方法返回 FALSE ,我們會顯示出 XML-RPC 服務器返回的錯誤信息。
XML-RPC 請求就是你發(fā)送給 XML-RPC 服務器的數(shù)據(jù),請求中的每一個數(shù)據(jù)也被稱為請求參數(shù)。 上面的例子中有兩個參數(shù):你網站的 URL 和 標題。當 XML-RPC 服務器收到請求后, 它會查找它所需要的參數(shù)。
請求參數(shù)必須放在一個數(shù)組中,且數(shù)組中的每個參數(shù)都必須是 7 種數(shù)據(jù)類型中的一種 (string、number、date 等),如果你的參數(shù)不是 string 類型,你必須在請求數(shù)組中 指定它的數(shù)據(jù)類型。
下面是三個參數(shù)的簡單例子:
$request = array('John', 'Doe', 'www.some-site.com');
$this->xmlrpc->request($request);
如果你的數(shù)據(jù)類型不是 string ,或者你有幾個不同類型的數(shù)據(jù),那么你需要將 每個參數(shù)放到它單獨的數(shù)組中,并在數(shù)組的第二位聲明其數(shù)據(jù)類型:
$request = array(
array('John', 'string'),
array('Doe', 'string'),
array(FALSE, 'boolean'),
array(12345, 'int')
);
$this->xmlrpc->request($request);
下面的 數(shù)據(jù)類型 一節(jié)列出了所有支持的數(shù)據(jù)類型。
XML-RPC 服務器扮演著類似于交通警察的角色,等待進入的請求, 并將它們轉到恰當?shù)暮瘮?shù)進行處理。
要創(chuàng)建你自己的 XML-RPC 服務器,你需要先在負責處理請求的控制器中初始化 XML-RPC 服務器類,然后設置一個映射數(shù)組,用于將請求轉發(fā)到合適的類和方法, 以便進行處理。
下面是個例子:
$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();
上例中包含了兩個服務器允許的請求方法,數(shù)組的左邊是允許的方法名, 數(shù)組的右邊是當請求該方法時,將會映射到的類和方法。
其中,'object' 是個特殊的鍵,用于傳遞一個實例對象,當映射的方法無法使用 CodeIgniter 超級對象時,它將是必須的。
換句話說,如果 XML-RPC 客戶端發(fā)送一個請求到 new_post 方法, 你的服務器會加載 My_blog 類并調用 new_entry 函數(shù)。如果這個請求是到update_post 方法的,那么你的服務器會加載 My_blog 類并調用 update_entry 方法。
上面例子中的函數(shù)名是任意的。你可以決定這些函數(shù)在你的服務器上叫什么名字, 如果你使用的是標準的 API,比如 Blogger 或者 MetaWeblog 的 API, 你必須使用標準的函數(shù)名。
這里還有兩個附加的配置項,可以在服務器類初始化時配置使用。debug 設為 TRUE 以便調試, xss_clean 可被設置為 FALSE 以避免數(shù)據(jù)被安全類庫的 xss_clean 函數(shù)過濾。
當 XML-RPC 服務器收到請求并加載類與方法來處理時,它會接收一個包含客戶端發(fā)送的數(shù)據(jù)參數(shù)。
在上面的例子中,如果請求的是 new_post 方法,服務器請求的類與方法會像這樣:
class My_blog extends CI_Controller {
public function new_post($request)
{
}
}
$request 變量是一個由服務端匯集的對象,包含由 XML-RPC 客戶端發(fā)送來的數(shù)據(jù)。 使用該對象可以讓你訪問到請求參數(shù)以便處理請求。請求處理完成后, 發(fā)送一個響應返回給客戶端。
下面是一個實際的例子,使用 Blogger API 。Blogger API 中的一個方法是 getUserInfo(), XML-RPC 客戶端可以使用該方法發(fā)送用戶名和密碼到服務器,在服務器返回的數(shù)據(jù)中, 會包含該用戶的信息(昵稱,用戶 ID,Email 地址等等)。下面是處理的代碼:
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('jsmith@yoursite.com', 'string'),
'lastname' => array('Smith', 'string'),
'firstname' => array('John', 'string')
),
'struct'
);
return $this->xmlrpc->send_response($response);
}
}
output_parameters() 函數(shù)獲取一個由客戶端發(fā)送的請求參數(shù)數(shù)組。 上面的例子中輸出參數(shù)將會是用戶名和密碼。
如果客戶端發(fā)送的用戶名和密碼無效的話,將使用 send_error_message() 函數(shù)返回錯誤信息。
如果操作成功,客戶端會收到包含用戶信息的響應數(shù)組。
和請求一樣,響應也必須被格式化為數(shù)組。然而不同于請求信息,響應數(shù)組 只包含一項 。 該項可以是一個包含其他數(shù)組的數(shù)組,但是只能有一個主數(shù)組,換句話說, 響應的結果大概是下面這個樣子:
$response = array('Response data', 'array');
但是,響應通常會包含多個信息。要做到這樣,我們必須把各個信息放到他們自己的數(shù)組中, 這樣主數(shù)組就始終只有一個數(shù)據(jù)項。下面是一個例子展示如何實現(xiàn)這樣的效果:
$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'
);
注意:上面的數(shù)組被格式化為 struct,這是響應最常見的數(shù)據(jù)類型。
如同請求一樣,響應可以是七種數(shù)據(jù)類型中的一種,參見 數(shù)據(jù)類型 一節(jié)。
如果你需要發(fā)送錯誤信息給客戶端,可以使用下面的代碼:
return $this->xmlrpc->send_error_message('123', 'Requested data not available');
第一個參數(shù)為錯誤編號,第二個參數(shù)為錯誤信息。
為了幫助你理解目前為止講的這些內容,讓我們來創(chuàng)建兩個控制器,演示下 XML-RPC 的客戶端和服務端。你將用客戶端來發(fā)送一個請求到服務端并從服務端收到一個響應。
使用文本編輯器創(chuàng)建一個控制器 Xmlrpc_client.php ,在這個控制器中, 粘貼以下的代碼并保存到 applications/controllers/ 目錄:
<?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 輔助函數(shù),更多關于輔助函數(shù)的信息, 你可以閱讀 這里 。
使用文本編輯器創(chuàng)建一個控制器 Xmlrpc_server.php ,在這個控制器中, 粘貼以下的代碼并保存到 applications/controllers/ 目錄:
<?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);
}
}
現(xiàn)在使用類似于下面這樣的鏈接訪問你的站點:
example.com/index.php/xmlrpc_client/
你應該能看到你發(fā)送到服務端的信息,以及服務器返回的響應信息。
在客戶端,你發(fā)送了一條消息("How's is going?")到服務端, 隨著一個請求發(fā)送到 "Greetings" 方法。服務端收到這個請求并映射到 "process" 函數(shù),然后返回響應信息。
如果你希望在你的方法參數(shù)中使用關聯(lián)數(shù)組,那么你需要使用 struct 數(shù)據(jù)類型:
$request = array(
array(
// Param 0
array('name' => 'John'),
'struct'
),
array(
// Param 1
array(
'size' => 'large',
'shape'=>'round'
),
'struct'
)
);
$this->xmlrpc->request($request);
你可以在服務端處理請求信息時獲取該關聯(lián)數(shù)組。
$parameters = $request->output_parameters();
$name = $parameters[0]['name'];
$size = $parameters[1]['size'];
$shape = $parameters[1]['shape'];
根據(jù) XML-RPC 規(guī)范 一共有七種不同的數(shù)據(jù)類型可以在 XML-RPC 中使用:
classCI_Xmlrpc
initialize([$config = array()])
參數(shù):
返回類型: void
初始化 XML-RPC 類,接受一個包含你設置的參數(shù)的關聯(lián)數(shù)組。
server($url[, $port = 80[, $proxy = FALSE[, $proxy_port = 8080]]])
參數(shù):
返回類型: void
用于設置 XML-RPC 服務器端的 URL 和端口:
$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);
支持基本的 HTTP 身份認證,只需簡單的將其添加到 URL中:
$this->xmlrpc->server('http://user:pass@localhost/', 80);
timeout($seconds = 5)
參數(shù):
返回類型: void
設置一個超時時間(單位為秒),超過該時間,請求將被取消:
$this->xmlrpc->timeout(6);
method($function)
參數(shù):
返回類型: void
設置 XML-RPC 服務器接受的請求方法:
$this->xmlrpc->method('method');
其中 method 參數(shù)為請求方法名。
request($incoming)
參數(shù):
返回類型: void
接受一個數(shù)組參數(shù),并創(chuàng)建一個發(fā)送到 XML-RPC 服務器的請求:
$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/');
$this->xmlrpc->request($request);
send_request()
返回: TRUE on success, FALSE on failure
返回類型: bool
發(fā)送請求的方法,成功返回 TRUE,失敗返回 FALSE ,可以用在條件判斷里。
display_error()
返回: Error message string
返回類型: string
當請求失敗后,返回錯誤信息。
echo $this->xmlrpc->display_error();
display_response()
返回: Response
返回類型: mixed
遠程服務器接收請求后返回的響應,返回的數(shù)據(jù)通常是一個關聯(lián)數(shù)組。
$this->xmlrpc->display_response();
send_error_message($number, $message)
參數(shù):
返回: XML_RPC_Response instance
返回類型: XML_RPC_Response
這個方法允許你從服務器發(fā)送一個錯誤消息到客戶端。 第一個參數(shù)是錯誤編號,第二個參數(shù)是錯誤信息。
return $this->xmlrpc->send_error_message(123, 'Requested data not available');
更多建議: