?
This document uses PHP Chinese website manual Release
CodeIgniter的XML-RPC類允許您向其他服務(wù)器發(fā)送請(qǐng)求,或者設(shè)置您自己的XML-RPC服務(wù)器來(lái)接收請(qǐng)求。
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)
類參考
很簡(jiǎn)單,這是兩臺(tái)計(jì)算機(jī)使用XML通過(guò)互聯(lián)網(wǎng)進(jìn)行通信的一種方式。一臺(tái)我們稱之為客戶端的計(jì)算機(jī)向另一臺(tái)計(jì)算機(jī)發(fā)送XML-RPC 請(qǐng)求,我們將其稱為服務(wù)器。一旦服務(wù)器收到并處理請(qǐng)求,它就會(huì)向客戶端發(fā)回一個(gè)響應(yīng)。
例如,使用MetaWeblog API,XML-RPC客戶端(通常是桌面發(fā)布工具)將向您的站點(diǎn)上運(yùn)行的XML-RPC服務(wù)器發(fā)送請(qǐng)求。此請(qǐng)求可能是發(fā)送用于發(fā)布的新博客條目,也可能是請(qǐng)求現(xiàn)有條目進(jìn)行編輯。當(dāng)XML-RPC服務(wù)器收到這個(gè)請(qǐng)求時(shí),它將檢查它以確定應(yīng)該調(diào)用哪個(gè)類/方法來(lái)處理請(qǐng)求。一旦處理完畢,服務(wù)器將發(fā)送回應(yīng)消息。
有關(guān)詳細(xì)說(shuō)明,您可以訪問(wèn)XML-RPC站點(diǎn)。
像CodeIgniter中的大多數(shù)其他類一樣,XML-RPC和XML-RPCS類在您的控制器中使用$ this-> load-> library函數(shù)進(jìn)行初始化:
要加載XML-RPC類,您將使用:
$this->load->library('xmlrpc');
加載后,xml-rpc庫(kù)對(duì)象將可用:$ this-> xmlrpc
要加載XML-RPC服務(wù)器類,您將使用:
$this->load->library('xmlrpc');$this->load->library('xmlrpcs');
加載后,xml-rpcs庫(kù)對(duì)象將可用:$ this-> xmlrpcs
注意
在使用XML-RPC服務(wù)器類時(shí),您必須加載XML-RPC類和XML-RPC服務(wù)器類。
要將請(qǐng)求發(fā)送到XML-RPC服務(wù)器,您必須指定以下信息:
服務(wù)器的URL
您希望調(diào)用的服務(wù)器上的方法
該請(qǐng)求的數(shù)據(jù)(在下面解釋)。
這是一個(gè)簡(jiǎn)單的例子,它向Ping-o-Matic發(fā)送一個(gè)簡(jiǎn)單的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類,設(shè)置要調(diào)用的服務(wù)器URL和方法(weblogUpdates.ping)。請(qǐng)求(在這種情況下,您的站點(diǎn)的標(biāo)題和URL)被放入一個(gè)數(shù)組中以便運(yùn)輸,并使用request()函數(shù)進(jìn)行編譯。最后,發(fā)送完整的請(qǐng)求。如果send_request()方法返回false,我們將顯示從XML-RPC服務(wù)器發(fā)回的錯(cuò)誤消息。
XML-RPC請(qǐng)求就是您發(fā)送到XML-RPC服務(wù)器的數(shù)據(jù)。請(qǐng)求中的每條數(shù)據(jù)都稱為請(qǐng)求參數(shù)。上面的例子有兩個(gè)參數(shù):網(wǎng)站的URL和標(biāo)題。當(dāng)XML-RPC服務(wù)器收到您的請(qǐng)求時(shí),它將查找它需要的參數(shù)。
請(qǐng)求參數(shù)必須放置在數(shù)組中以便運(yùn)輸,并且每個(gè)參數(shù)可以是七種數(shù)據(jù)類型之一(字符串,數(shù)字,日期等)。如果你的參數(shù)不是字符串,你將不得不在請(qǐng)求數(shù)組中包含數(shù)據(jù)類型。
下面是一個(gè)簡(jiǎn)單的三個(gè)參數(shù)數(shù)組的例子:
$request = array('John', 'Doe', 'www.some-site.com');$this->xmlrpc->request($request);
如果使用字符串以外的數(shù)據(jù)類型,或者如果您有多種不同的數(shù)據(jù)類型,則將每個(gè)參數(shù)放入其自己的數(shù)組中,數(shù)據(jù)類型位于第二個(gè)位置:
$request = array( array('John', 'string'), array('Doe', 'string'), array(FALSE, 'boolean'), array(12345, 'int'));$this->xmlrpc->request($request);
下面的數(shù)據(jù)類型部分有一個(gè)完整的數(shù)據(jù)類型列表。
XML-RPC服務(wù)器充當(dāng)各種流量警察,等待傳入的請(qǐng)求并將它們重定向到適當(dāng)?shù)暮瘮?shù)進(jìn)行處理。
要?jiǎng)?chuàng)建自己的XML-RPC服務(wù)器,需要在控制器中初始化希望傳入請(qǐng)求出現(xiàn)的XML-RPC服務(wù)器類,然后使用映射指令設(shè)置數(shù)組,以便傳入的請(qǐng)求可以發(fā)送到相應(yīng)的類和方法處理。
下面是一個(gè)例子來(lái)說(shuō)明:
$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();
以上示例包含一個(gè)指定服務(wù)器允許的兩個(gè)方法請(qǐng)求的數(shù)組。允許的方法在數(shù)組的左側(cè)。當(dāng)收到其中任何一個(gè)時(shí),它們將被映射到右側(cè)的類和方法。
'object'鍵是一個(gè)特殊的鍵,它傳遞一個(gè)實(shí)例化的類對(duì)象,當(dāng)你映射的方法不是CodeIgniter超級(jí)對(duì)象的一部分時(shí),這是必需的。
換句話說(shuō),如果XML-RPC客戶端發(fā)送new_post方法的請(qǐng)求,您的服務(wù)器將加載My_blog類并調(diào)用new_entry函數(shù)。如果請(qǐng)求是針對(duì)update_post方法的,那么您的服務(wù)器將加載My_blog類并調(diào)用該update_entry()
方法。
上例中的函數(shù)名稱是任意的。您將決定在服務(wù)器上應(yīng)該調(diào)用哪些應(yīng)用程序,或者如果您使用的是標(biāo)準(zhǔn)化API(如Blogger或MetaWeblog API),則可以使用它們的函數(shù)名稱。
在初始化服務(wù)器類時(shí)可以使用兩個(gè)額外的配置鍵:為了啟用調(diào)試,可以將debug設(shè)置為T(mén)RUE,并且可以將xss_clean設(shè)置為FALSE以阻止通過(guò)安全庫(kù)的xss_clean()
方法發(fā)送數(shù)據(jù)。
當(dāng)XML-RPC服務(wù)器接收到一個(gè)請(qǐng)求并加載類/方法進(jìn)行處理時(shí),它會(huì)將一個(gè)對(duì)象傳遞給包含客戶端發(fā)送數(shù)據(jù)的方法。
使用上面的例子,如果請(qǐng)求new_post方法,服務(wù)器將期望一個(gè)類存在于這個(gè)原型中:
class My_blog extends CI_Controller { public function new_post($request) { }}
$ request變量是服務(wù)器編譯的一個(gè)對(duì)象,它包含由XML-RPC客戶端發(fā)送的數(shù)據(jù)。使用這個(gè)對(duì)象,你將有權(quán)訪問(wèn)請(qǐng)求參數(shù),使你能夠處理請(qǐng)求。完成后,您將向客戶發(fā)送回應(yīng)。
以下是使用Blogger API的真實(shí)示例。Blogger API中的一種方法是getUserInfo()
。使用這種方法,XML-RPC客戶端可以向服務(wù)器發(fā)送一個(gè)用戶名和密碼,作為回報(bào),服務(wù)器返回關(guān)于該特定用戶的信息(昵稱,用戶ID,電子郵件地址等)。以下是處理函數(shù)的外觀:
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()
方法檢索與客戶端發(fā)送的請(qǐng)求參數(shù)相對(duì)應(yīng)的索引數(shù)組。在上面的例子中,輸出參數(shù)將是用戶名和密碼。
如果客戶端發(fā)送的用戶名和密碼無(wú)效,并且使用返回錯(cuò)誤消息send_error_message()
。
如果操作成功,客戶端將返回一個(gè)包含用戶信息的響應(yīng)數(shù)組。
與請(qǐng)求類似,響應(yīng)必須被格式化為一個(gè)數(shù)組。但是,與請(qǐng)求不同,響應(yīng)是包含單個(gè)項(xiàng)目的數(shù)組。該項(xiàng)可以是一個(gè)包含多個(gè)附加數(shù)組的數(shù)組,但只能有一個(gè)主數(shù)組索引。換句話說(shuō),基本原型是這樣的:
$response = array('Response data', 'array');
但是,回復(fù)通常包含多條信息。為了實(shí)現(xiàn)這一點(diǎn),我們必須將響應(yīng)放入其自己的數(shù)組中,以便主數(shù)組繼續(xù)包含單個(gè)數(shù)據(jù)。這里有一個(gè)例子顯示了這可能是如何實(shí)現(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ù)組被格式化為一個(gè)結(jié)構(gòu)體。這是響應(yīng)最常用的數(shù)據(jù)類型。
與請(qǐng)求一樣,響應(yīng)可以是“數(shù)據(jù)類型”部分中列出的七種數(shù)據(jù)類型之一。
如果您需要向客戶端發(fā)送錯(cuò)誤響應(yīng),您將使用以下內(nèi)容:
return $this->xmlrpc->send_error_message('123', 'Requested data not available');
第一個(gè)參數(shù)是錯(cuò)誤號(hào),而第二個(gè)參數(shù)是錯(cuò)誤消息。
為了幫助您了解迄今為止所介紹的所有內(nèi)容,我們創(chuàng)建一個(gè)用作XML-RPC客戶端和服務(wù)器的控制器。您將使用客戶端向服務(wù)器發(fā)送請(qǐng)求并接收響應(yīng)。
使用文本編輯器創(chuàng)建一個(gè)名為Xmlrpc_client.php的控制器。在它中,放置這些代碼并將其保存到您的應(yīng)用程序/控制器/文件夾中:
<?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助手”。您可以在幫助者功能頁(yè)面找到更多信息。
使用文本編輯器創(chuàng)建一個(gè)名為Xmlrpc_server.php的控制器。在它中,放置這些代碼并將其保存到您的應(yīng)用程序/控制器/文件夾中:
<?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); }}
現(xiàn)在使用類似下面的網(wǎng)址訪問(wèn)您的網(wǎng)站:
example.com/index.php/xmlrpc_client/
您現(xiàn)在應(yīng)該看到您發(fā)送給服務(wù)器的消息,并將其響應(yīng)回復(fù)給您。
您創(chuàng)建的客戶端會(huì)向服務(wù)器發(fā)送一條消息(“該怎么回事?”)以及“Greetings”方法的請(qǐng)求。服務(wù)器接收請(qǐng)求并將其映射到process()
發(fā)送響應(yīng)的方法。
如果你想在你的方法參數(shù)中使用關(guān)聯(lián)數(shù)組,你將需要使用一個(gè)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);
在服務(wù)器中處理請(qǐng)求時(shí),您可以檢索關(guān)聯(lián)數(shù)組。
$parameters = $request->output_parameters();$name = $parameters[0]['name'];$size = $parameters[1]['size'];$shape = $parameters[1]['shape'];
根據(jù)XML-RPC規(guī)范,您可以通過(guò)XML-RPC發(fā)送七種類型的值:
int或i4
布爾
串
雙
dateTime.iso8601
BASE64
結(jié)構(gòu)(包含值的數(shù)組)
數(shù)組(包含值數(shù)組)
class CI_Xmlrpcinitialize([$config = array()])
參數(shù): | $ config(array) - 配置數(shù)據(jù) |
---|---|
返回類型: | void |
$ config(array) - 配置數(shù)據(jù)
Return type: void
初始化XML-RPC庫(kù)。接受包含您的設(shè)置的關(guān)聯(lián)數(shù)組。
server($url[, $port = 80[, $proxy = FALSE[, $proxy_port = 8080]]])
參數(shù): | $ url(string) - XML-RPC服務(wù)器URL $ port(int) - 服務(wù)器端口$ proxy(字符串) - 可選代理$ proxy_port(int) - 代理偵聽(tīng)端口 |
---|---|
返回類型: | void |
$ url(字符串) - XML-RPC服務(wù)器URL
$ port(int) - 服務(wù)器端口
$ proxy(字符串) - 可選代理
$ proxy_port(int) - 代理偵聽(tīng)端口
Return type: void
設(shè)置請(qǐng)求發(fā)送到的服務(wù)器的URL和端口號(hào):
$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);
基本的HTTP身份驗(yàn)證也被支持,只需將其添加到服務(wù)器URL即可:
$this->xmlrpc->server('http://user:[email protected]/', 80);
timeout($seconds = 5)
參數(shù): | $ seconds(int) - 以秒為單位的超時(shí) |
---|---|
返回類型: | 空虛 |
$ seconds(int) - 以秒為單位的超時(shí)
Return type: void
設(shè)置超時(shí)期限(以秒為單位),之后請(qǐng)求將被取消:
$this->xmlrpc->timeout(6);
這個(gè)超時(shí)時(shí)間將用于初始連接到遠(yuǎn)程服務(wù)器,以及從中獲取響應(yīng)。確保您在調(diào)用之前設(shè)置超時(shí)send_request()
。
method($function)
參數(shù): | $ function(string) - 方法名稱 |
---|---|
返回類型: | void |
$ function(string) - 方法名稱
Return type: void
設(shè)置將從XML-RPC服務(wù)器請(qǐng)求的方法:
$this->xmlrpc->method('method');
方法是方法的名稱。
request($incoming)
參數(shù): | $ incoming(array) - 請(qǐng)求數(shù)據(jù) |
---|---|
返回類型: | void |
$ incoming(array) - 請(qǐng)求數(shù)據(jù)
Return type: void
獲取一組數(shù)據(jù)并構(gòu)建發(fā)送到XML-RPC服務(wù)器的請(qǐng)求:
$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/'); $this->xmlrpc->request($request);
send_request()
返回: | 成功為T(mén)RUE,失敗為FALSE |
---|---|
返回類型: | 布爾 |
display_error()
返回: | 錯(cuò)誤消息字符串 |
---|---|
返回類型: | 串 |
display_response()
返回: | 響應(yīng) |
---|---|
返回類型: | mixed |
send_error_message($number, $message)
參數(shù): | $ number(int) - 錯(cuò)誤號(hào)$ message(string) - 錯(cuò)誤消息 |
---|---|
返回: | XML_RPC_Response實(shí)例 |
返回類型: | XML_RPC_Response |
$ number(int) - 錯(cuò)誤號(hào)
$ message(string) - 錯(cuò)誤消息
Returns: XML\_RPC\_Response instance
Return type: XML\_RPC\_Response
此方法可讓您從服務(wù)器向客戶端發(fā)送錯(cuò)誤消息。第一個(gè)參數(shù)是錯(cuò)誤號(hào),第二個(gè)參數(shù)是錯(cuò)誤消息。
返回$ this-> xmlrpc-> send_error_message(123,'請(qǐng)求的數(shù)據(jù)不可用');