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


上一篇: XML-RPC實例(Java) 下一篇: Python3實現RPC