2008-11-03 33 views
2

我想在我的Drupal(PHP)後端上使用XML-RPC服務器,以使我的Perl後端更容易與它交談。但是,我遇到了一個問題,我不確定哪些部分(如果有的話)是缺陷。從本質上講,我需要傳遞給Drupal的一些變量是有時充滿數字的字符串,並且Drupal XML-RPC服務器返回一個錯誤,即當字符串充滿數字時,它沒有正確形成。我應該如何處理XML :: RPC和Drupal中的數字字符串?

我的Perl代碼目前看起來像這樣。

use strict; 
use warnings; 
use XML::RPC; 
use Data::Dumper; 
my $xmlrpc = XML::RPC->new(URL); 
my $result = $xmlrpc->call(FUNCTION, 'hello world', '9876352345'); 
print Dumper $result; 

的輸出是:

$VAR1 = { 
     'faultString' => 'Server error. Invalid method parameters.', 
     'faultCode' => '-32602' 
}; 

當我有Drupal的XML-RPC服務器打印出接收到的數據,我注意到,第二個參數的類型爲6-14:

<param> 
<value> 
<i4>9876352345</i4> 
</value> 

我想當Drupal完成處理項目時,它將該變量作爲int輸入,而不是字符串。這意味着當Drupal稍後嘗試檢查變量值是否爲字符串正確形成時,is_string PHP函數返回false。

foreach ($signature as $key => $type) { 
    $arg = $args[$key]; 
    switch ($type) { 
    case 'int': 
    case 'i4': 
     if (is_array($arg) || !is_int($arg)) { 
     $ok = FALSE; 
     } 
     break; 
    case 'base64': 
    case 'string': 
     if (!is_string($arg)) { 
     $ok = FALSE; 
     } 
     break; 
    case 'boolean': 
     if ($arg !== FALSE && $arg !== TRUE) { 
     $ok = FALSE; 
     } 
     break; 
    case 'float': 
    case 'double': 
     if (!is_float($arg)) { 
     $ok = FALSE; 
     } 
     break; 
    case 'date': 
    case 'dateTime.iso8601': 
     if (!$arg->is_date) { 
     $ok = FALSE; 
     } 
     break; 
    } 
    if (!$ok) { 
    return xmlrpc_error(-32602, t('Server error. Invalid method parameters.')); 
    } 
} 

我不知道的是在問題的分歧的哪一方面,或者如果有什麼我應該使用的。如果來自Perl方面的請求將內容輸入爲字符串而不是i4,或者請求的Drupal端對於字符串類型過於嚴格?我的猜測是這個問題是後者,但我對XML-RPC服務器應該如何工作以確定知道的知之甚少。

回答

0

我對XML :: RPC軟件包沒有任何經驗,但我是RPC::XML CPAN模塊的作者。與Frontier軟件包一樣,我提供了一種方法來強制將值變爲特定類型,否則將默認爲其他值。

如果我不得不猜測,我會說你使用的包簡單地在數據上做一個正則表達式匹配來決定如何輸入它。我和我的軟件包有類似的問題,並且考慮到Perl處理標量值的方式,唯一真正的解決辦法是強制顯式聲明。正如前面的答覆者指出的那樣,這個值實際上超出了<類型的範圍(這是一個有符號的32位值)。所以,即使你打算它是一個整數值,對於XML-RPC規範來說,它也是無效的。

我建議切換到其他XML-RPC包之一,它具有更明確的鍵入數據的方式。根據XML :: RPC的文檔,可以強制輸入數據,但我發現它不清楚,也沒有很好解釋。

+0

謝謝!我以前一直在使用RPC :: XML庫,並且會切換回它。 – 2008-11-04 12:11:14

1

數字9876352345太大而不適合32位整數。這可能會導致問題。

1

你使用邊界?也許你可以明確聲明字符串?從client docs

my $result = 
    $xmlrpc->call(FUNCTION, 'hello world', $xmlrpc->string('9876352345')); 

信息:

默認情況下,你可以通過普通的Perl值(標量)進行編碼。如果RPC2類似於整數,浮點或字符串,RPC2會自動將它們轉換爲XML-RPC類型。當你想傳遞一個看起來像「0096」的字符串時,這個假設會導致問題,RPC2會將它轉換爲一個字符串,因爲它看起來像一個整數。

+0

謝謝歐文。這種類型的信息正是我所需要的。 – 2008-11-04 13:37:18

相關問題