Я пытаюсь использовать сервер 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 должен работать, чтобы знать наверняка.