Как мне обращаться со строками цифр в XML :: RPC и Drupal? - PullRequest
2 голосов
/ 04 ноября 2008

Я пытаюсь использовать сервер XML-RPC на моей бэкэнде Drupal (PHP), чтобы облегчить для моего бэкэнда 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 попытается проверить, правильно ли сформировано значение переменной для строки, PHP-функция is_string возвращает 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 должен работать, чтобы знать наверняка.

Ответы [ 3 ]

1 голос
/ 04 ноября 2008

вы используете границу? возможно, вы могли бы объявить строку явно?

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

информация из клиентских документов :

По умолчанию вы можете передавать обычные значения Perl (скаляры) для кодирования. RPC2 автоматически преобразует их в типы XML-RPC, если они выглядят как целое число, число с плавающей запятой или как строка. Это предположение вызывает проблемы, когда вы хотите передать строку, которая выглядит как «0096», RPC2 преобразует это в, потому что это выглядит как целое число.

1 голос
/ 04 ноября 2008

Число 9876352345 слишком велико, чтобы поместиться в 32-битное целое число. Это может вызвать проблему.

0 голосов
/ 04 ноября 2008

У меня нет опыта работы с пакетом XML :: RPC, но я являюсь автором CPAN-модуля RPC :: XML . Как и в пакете Frontier, я предоставляю способ принудительного ввода значения в конкретный тип, когда в противном случае по умолчанию используется другое значение.

Если бы мне пришлось угадывать, я бы сказал, что пакет, который вы используете, просто сопоставляет данные с регулярным выражением, чтобы решить, как его набирать. У меня была похожая проблема с моим пакетом, и, учитывая способ, которым Perl обрабатывает скалярные значения, единственный реальный способ обойти это - заставить его явным объявлением. Как указывал предыдущий ответчик, рассматриваемое значение фактически находится вне диапазона типа (который является 32-битным значением со знаком). Таким образом, даже если бы вы предполагали, что это целочисленное значение, оно было бы недопустимым в отношении спецификации XML-RPC.

Я бы порекомендовал переключиться на один из других пакетов XML-RPC, которые имеют более четкие способы явного ввода данных. Согласно документам для XML :: RPC, можно принудительно вводить данные, но я обнаружил, что это неясно и не очень хорошо объяснено.

...