【问题标题】:How should I treat strings of digits in XML::RPC and Drupal?我应该如何处理 XML::RPC 和 Drupal 中的数字字符串?
【发布时间】:2008-11-03 22:03:36
【问题描述】:

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

【问题讨论】:

    标签: perl drupal xml-rpc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      来自client docs的信息:

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

      【讨论】:

      • 谢谢欧文。这类信息正是我所需要的。
      【解决方案3】:

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

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

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

      【讨论】:

      • 谢谢!我之前一直在使用 RPC::XML 库,我将切换回它。
      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2016-09-23
      • 2021-09-13
      • 2011-07-14
      相关资源
      最近更新 更多