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 或日期時間

參數:http://www.php.net/manual/zh/book.xmlrpc.php