Perl 我应该如何处理XML::RPC和Drupal中的数字字符串?

Perl 我应该如何处理XML::RPC和Drupal中的数字字符串?,perl,drupal,xml-rpc,Perl,Drupal,Xml Rpc,我试图在Drupal(PHP)后端上使用XML-RPC服务器,以使Perl后端更容易与之对话。然而,我遇到了一个问题,我不确定哪些部分(如果有的话)是bug。本质上,我需要传递给Drupal的一些变量是字符串,有时是充满数字的字符串,Drupal XML-RPC服务器返回一个错误,即当字符串充满数字时,它的格式不正确 我的Perl代码目前看起来像这样 use strict; use warnings; use XML::RPC; use Data::Dumper; my $xmlrpc = XM

我试图在Drupal(PHP)后端上使用XML-RPC服务器,以使Perl后端更容易与之对话。然而,我遇到了一个问题,我不确定哪些部分(如果有的话)是bug。本质上,我需要传递给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>

我不确定的是问题在分歧的哪一边,或者我是否应该使用其他东西。来自Perl端的请求是否应该将内容键入字符串而不是i4,或者请求的Drupal端对于字符串类型是否过于严格?我猜问题是后者,但我对XML-RPC服务器应该如何工作还不太了解,因此无法确定。

数字
9876352345
太大,无法容纳32位整数。这可能会导致问题。

您正在使用frontier吗?也许您可以显式地声明字符串

my $result =
  $xmlrpc->call( FUNCTION, 'hello world', $xmlrpc->string('9876352345') );
信息来自:

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


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

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


我建议切换到另一个XML-RPC包,它有更清晰的方式显式地键入数据。根据docs for XML::RPC,强制键入数据是可能的,但我发现它不清楚,也没有很好的解释。

谢谢!我之前一直在使用RPC::XML库,现在我将切换回它。谢谢Owen。这类信息正是我所需要的。
my $result =
  $xmlrpc->call( FUNCTION, 'hello world', $xmlrpc->string('9876352345') );