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 サーバーに受信したデータを出力させると、2 番目の引数が 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 サーバーがどのように機能するのかについて、確実に知るには十分ではありません。