2

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 サーバーがどのように機能するのかについて、確実に知るには十分ではありません。

4

3 に答える 3

1

フロンティア使ってる?おそらく、文字列を明示的に宣言できますか?

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

クライアント ドキュメントからの情報:

デフォルトでは、エンコードする通常の Perl 値 (スカラー) を渡すことができます。RPC2 は、それらが整数、浮動小数点数、または文字列のように見える場合、自動的に XML-RPC 型に変換します。この仮定は、「0096」のような文字列を渡したい場合に問題を引き起こします。RPC2 は、整数のように見えるため、それを に変換します。

于 2008-11-03T23:09:45.537 に答える
1

数値9876352345が大きすぎて 32 ビット整数に収まりません。それが問題を引き起こす可能性があります。

于 2008-11-03T23:05:45.713 に答える
0

XML::RPC パッケージの経験はありませんが、RPC::XML CPAN モジュールの作成者です。Frontier パッケージと同様に、値を特定の型に強制する方法を提供します。

推測する必要がある場合は、単純に使用しているパッケージが、データに対して正規表現の一致を行って、入力方法を決定していると言えます。私のパッケージでも同様の問題がありました.Perlがスカラー値を処理する方法を考えると、それを回避する唯一の実際の方法は、明示的な宣言でそれを強制することです. 前の回答者が指摘したように、問題の値は実際には <i4> 型 (符号付き 32 ビット値) の範囲外です。したがって、整数値を意図していたとしても、XML-RPC 仕様に関しては無効でした。

明示的にデータを入力するより明確な方法がある他の XML-RPC パッケージのいずれかに切り替えることをお勧めします。XML::RPC のドキュメントによると、データの型付けを強制することは可能ですが、私はそれが不明確であり、あまりよく説明されていないことに気付きました。

于 2008-11-04T11:28:04.797 に答える