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