2012-01-17 66 views
0

我在探索使用XMLRPC服務在Drupal系統和我們網站的另一部分之間進行通信。我發現了PHP的php_xmlrpc擴展的一些示例代碼,但發現我們的Web主機不支持該擴展。PEAR XML_RPC_encode vs PHP xmlrpc_encode_request

取而代之的是,他們所提供的PEAR XML_RPC包

它出現的兩種方法進行編碼非常不同。

我用來設置該請求的PHP代碼,基於http://drupal.org/node/339845

$method_name = 'user.login'; 
$user_credentials = array(
    0 => 'example.user', 
    1 => 'password', 
); 

// any user-defined arguments for this service 
// here we use the login credentials we specified at the top of the script 
$user_args = $user_credentials; 
$required_args=array(); 

// add the arguments to the request 
foreach ($user_args as $arg) { 
    array_push($required_args, $arg); 
} 

...then call the XMLRPC functions here... 

我在我的電腦上測試php_xmlrpc與WAMPserver,並從php_xmlrpc功能xmlrpc_encode_request(http://us.php.net/manual/en/function.xmlrpc-encode-request.php)返回我所需要的,是這樣的:

<?xml version="1.0" encoding="iso-8859-1"?> 
<methodCall> 
<methodName>user.login</methodName> 
<params> 
<param> 
    <value> 
    <string>example.user</string> 
    </value> 
</param> 
<param> 
    <value> 
    <string>password</string> 
    </value> 
</param> 
</params> 
</methodCall> 

而PEAR XML_RPC_encode()函數返回此:

Array 
(
    [0] => example.user 
    [1] => password 
) 
object(XML_RPC_Value)#1 (2) { 
    ["me"]=> 
    array(1) { 
    ["string"]=> 
    string(10) "user.login" 
    } 
    ["mytype"]=> 
    int(1) 
} 

PEAR XML_RPC中是否有另外一個函數可以將參數編碼到XML中?

回答

1

該文檔可從http://pear.php.net/manual/en/package.webservices.xml-rpc.api.php

爲了讓XML編組輸出首先構造一個消息,而不是,然後使用->serialize()方法:

$msg = new XML_RPC_Message("function", array(new XML_RPC_Value(123, "int"))); 
print $msg->serialize(); 

XML_RPC_encode()功能是爲了換一個普通的php數組變成這樣的XML_RPC_*對象。

但是很顯然,PEAR類主要是通過處理原始數據轉換的XML_RPC_Client接口使用。

+0

謝謝馬里奧!這正是我需要的。我對PEAR軟件包沒有太多的經驗,並且在他們的文檔中有點失落。我標記你的答案是正確的,如果它允許我的話,你會贊成。 – 2012-01-17 20:39:00

+0

嗯,確實是這樣,PEAR文件並不總是可用的,並不是所有情況下都有用。而且這個類也只是比較簡單的PHP內置函數早一些。 (不要擔心投票,如果你能報告回答哪個答案有效就足夠了,這對未來的訪問者最有幫助。) – mario 2012-01-17 21:34:04