2

我正在尝试在我的 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 服务器应该如何工作的了解还不够,无法确定。

4

3 回答 3

1

该数字9876352345太大而无法放入 32 位整数。这可能会导致问题。

于 2008-11-03T23:05:45.713 回答
1

你在使用前沿吗?也许您可以明确声明字符串?

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

来自客户文档的信息:

默认情况下,您可以传递普通的 Perl 值(标量)进行编码。如果它们看起来像整数、浮点数或字符串,RPC2 会自动将它们转换为 XML-RPC 类型。当你想要传递一个看起来像“0096”的字符串时,这个假设会导致问题,RPC2 会将它转换为一个,因为它看起来像一个整数。

于 2008-11-03T23:09:45.537 回答
0

我对 XML::RPC 包没有任何经验,但我是RPC::XML CPAN 模块的作者。与 Frontier 包一样,我提供了一种将值强制为特定类型的方法,否则它会默认为其他类型。

如果我不得不猜测,我会说您使用的包 simple 对数据进行正则表达式匹配以决定如何键入它。我的包也有类似的问题,考虑到 Perl 处理标量值的方式,唯一真正的解决方法是通过显式声明来强制它。正如之前的回答者所指出的,所讨论的值实际上超出了 <i4> 类型的范围(这是一个有符号的 32 位值)。因此,即使您希望它是一个整数值,它对于 XML-RPC 规范也是无效的。

我建议切换到其他 XML-RPC 包之一,它具有更清晰的显式键入数据的方式。根据 XML::RPC 的文档,可以强制输入数据,但我发现它不清楚并且没有很好地解释。

于 2008-11-04T11:28:04.797 回答