我想在我的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服務器應該如何工作以確定知道的知之甚少。
謝謝!我以前一直在使用RPC :: XML庫,並且會切換回它。 – 2008-11-04 12:11:14