我正在尝试在我的 Drupal (PHP) 后端使用 XML-RPC 服务器,以使我的 Perl 后端更容易与之通信。但是,我遇到了一个问题,我不确定哪些部分(如果有的话)是错误。本质上,我需要传递给 Drupal 的一些变量是字符串,有时是充满数字的字符串,并且 Drupal XML-RPC 服务器返回一个错误,即当字符串充满数字时,它的格式不正确。
我的 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 服务器打印出它接收到的数据时,我注意到第二个参数的类型为 i4:
<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 服务器应该如何工作的了解还不够,无法确定。