XML-RPC實例(PHP)
在這一小節文章中,將通過一個PHP實現XML-RPC調用示例的講解,讓大家瞭解在PHP中,如何編寫使用XML-RPC的PHP程序。
PHP編程語言中集成了XML-RPC和SOAP兩種Web Service通信兩種協議標準,基本的思想就是使用基於XML的HTTP的遠程調用提供一種標準的機制,而省去建立一種新協議的需求。其實這在實際開發應用中是非常實用,比如PC客戶端或者現在流行的手機客戶端需要同服務器端通信,這時候XML-RPC就是一個很好的解決辦法。
基本原理就是XML-RPC使用XML來進行通信。首先構造一個RPC 服務器端用來出來從RPC客戶端傳遞過來的使用XML封裝的請求,並且把處理結果通過XML的形式返回給RPC客戶端,客戶端就去分析XML獲取自己需要的數據。XML-RPC的服務器端必須有現成的函數提供給客戶端調用,並且客戶端提交的請求中的函數和方法必須和服務器端的一致,否則將無法獲取所需要的結果。
首先要確保您的PHP環境中有支持XML-RPC擴展,如果沒有可以請安裝,windows下php_xmlrpc.dll
放到PHP擴展目錄下,Linux重新編譯PHP,在configure
的時候加上 –with-xmlrpc
選項,如果用的是Ubuntu,所以直接 sudo apt-get install php5-xmlrpc
就可以了。這裏以Windows下的WAMP集成開發環境來運行此示例代碼。
服務器端代碼如下(文件:server.php) :
<?php
/*
* @function 提供給RPC客戶端調用的函數
* @param string $method 客戶端需要調用的函數
* @param array $params 客戶端需要調用的函數的參數數組
* return string 返回調用結果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == "get") {
$return = 'This data by get method';
} else {
$return = 'Not specify method or params';
}
return $return;
}
//產生XML-RPC的服務器端
$xmlrpc_server = xmlrpc_server_create();
//註冊一個服務器端調用的方法rpc_server,實際指向的是rpc_server_func函數
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");
//接受客戶端POST過來的XML數據
$request = $HTTP_RAW_POST_DATA;
//執行調用客戶端的XML請求後獲取執行結果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);
//把函數處理後的結果XML進行輸出
header('Content-Type: text/xml');
echo $xmlrpc_response;
//銷燬XML-RPC服務器端資源
xmlrpc_server_destroy($xmlrpc_server);
?>
客戶端代碼,文件:client.php -
<?php
/*
* @function 提供給客戶端進行連接XML-RPC服務器端的函數
* @param string $host 需要連接的主機
* @param string $port 連接主機的端口
* @param string $rpc_server XML-RPC服務器端文件
* @param $request 封裝的XML請求信息
* return 成功返回由服務器端返回的XML信息,失敗返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) {
//打開指定的服務器端
$fp = fsockopen($host, $port);
//構造需要進行通信的XML-RPC服務器端的查詢POST請求信息
$query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: " . $host . "\nContent-Type: text/xml\nContent-Length: " . strlen($request) . "\n\n" . $request . "\n";
//把構造好的HTTP協議發送給服務器,失敗返回false
if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return false;
}
//獲取從服務器端返回的所有信息,包括HTTP頭和XML信息
$contents = "";
while (!feof($fp)) {
$contents .= fgets($fp);
}
//關閉連接資源後返回獲取的內容
fclose($fp);
return $contents;
}
//構造連接RPC服務器端的信息
$host = 'localhost';
$port = 80;
$rpc_server = 'server.php';
//把需要發送的XML請求進行編碼成XML,需要調用的方法是rpc_server,參數是get
$request = xmlrpc_encode_request('rpc_server', 'get');
//調用rpc_client_call函數把所有請求發送給XML-RPC服務器端後獲取信息
$response = rpc_client_call($host, $port, $rpc_server, $request);
//分析從服務器端返回的XML,去掉HTTP頭信息,並且把XML轉爲PHP能識別的字符串
$split = "";
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);
//輸出從RPC服務器端獲取的信息
print_r($response);
XML-RPC函數參考:
-
xmlrpc_decode_request
— 將 XML 譯碼爲 PHP 本身的類型 -
xmlrpc_decode
— 將 XML 譯碼爲 PHP 本身的類型 -
xmlrpc_encode_request
— 爲 PHP 的值生成 XML -
xmlrpc_encode
— 爲 PHP 的值生成 XML -
xmlrpc_get_type
— 爲 PHP 的值獲取 xmlrpc 的類型 -
xmlrpc_is_fault
— Determines if an array value represents an XMLRPC fault -
xmlrpc_parse_method_descriptions
— 將 XML 譯碼成方法描述的列表 -
xmlrpc_server_add_introspection_data
— 添加自我描述的文檔 -
xmlrpc_server_call_method
— 解析 XML 請求同時調用方法 -
xmlrpc_server_create
— 創建一個 xmlrpc 服務端 -
xmlrpc_server_destroy
— 銷燬服務端資源 -
xmlrpc_server_register_introspection_callback
— 註冊一個 PHP 函數用於生成文檔 -
xmlrpc_server_register_method
— 註冊一個 PHP 函數用於匹配 xmlrpc 方法名 -
xmlrpc_set_type
— 爲一個 PHP 字符串值設置 xmlrpc 的類型、base64 或日期時間