Domanda

Sto cercando di usare un server XML-RPC sul mio back-end Drupal (PHP) per rendere più semplice la conversazione con il mio back-end Perl. Tuttavia, ho riscontrato un problema e non sono sicuro di quali parti, se presenti, sono bug. In sostanza, alcune delle variabili che devo passare a Drupal sono stringhe che a volte sono stringhe piene di numeri e il server XML-RPC Drupal restituisce un errore che quando una stringa è piena di numeri non è formata correttamente.

Il mio codice Perl è simile a questo al momento.

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;

L'output è:

$VAR1 = {
      'faultString' => 'Server error. Invalid method parameters.',
      'faultCode' => '-32602'
};

Quando il server Drupal XML-RPC stampa i dati che riceve, noto che il secondo argomento viene digitato come i4:

<param>
<value>
<i4>9876352345</i4>
</value>

Penso che quando Drupal finisce di elaborare l'elemento, sta digitando quella variabile come int anziché come stringa. Ciò significa che quando Drupal in seguito tenta di verificare che il valore della variabile sia correttamente formato per una stringa, la funzione PHP is_string restituisce 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.'));
  }
}

Quello di cui non sono sicuro è da che parte della divisione si trova il problema o se c'è qualcos'altro che dovrei usare. La richiesta dal lato Perl dovrebbe digitare il contenuto come una stringa anziché i4 o il lato Drupal della richiesta è troppo rigoroso per il tipo di stringa? La mia ipotesi è che il problema sia quest'ultimo, ma non so abbastanza su come dovrebbe funzionare un server XML-RPC per saperlo con certezza.

È stato utile?

Soluzione

Non ho alcuna esperienza con il pacchetto XML :: RPC, ma sono l'autore del RPC :: XML modulo CPAN. Come per il pacchetto Frontier, fornisco un modo per forzare un valore in un tipo specifico quando altrimenti andrebbe diversamente da qualcos'altro.

Se dovessi indovinare, direi che il pacchetto che stai usando fa semplicemente una corrispondenza di espressione regolare sui dati per decidere come digitarlo. Ho avuto un problema simile con il mio pacchetto, e dato il modo in cui Perl gestisce i valori scalari, l'unico vero modo per aggirarlo è forzarlo con una dichiarazione esplicita. Come ha sottolineato un precedente risponditore, il valore in questione è in realtà al di fuori dell'intervallo di & Lt; i4 & Gt; tipo (che è un valore con segno a 32 bit). Quindi, anche se avessi voluto che fosse un valore intero, sarebbe stato non valido per quanto riguarda le specifiche XML-RPC.

Vorrei raccomandare di passare a uno degli altri pacchetti XML-RPC, che hanno modi più chiari di digitare esplicitamente i dati. Secondo i documenti per XML :: RPC, è possibile forzare la digitazione dei dati, ma l'ho trovato poco chiaro e non molto ben spiegato.

Altri suggerimenti

Il numero 9876352345 è troppo grande per rientrare in un numero intero a 32 bit. Ciò potrebbe causare il problema.

stai usando frontier? forse potresti dichiarare esplicitamente la stringa?

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

informazioni dai documenti client :

  

Per impostazione predefinita, è possibile passare i normali valori Perl (scalari) da codificare. RPC2 li converte automaticamente in tipi XML-RPC se sembrano numeri interi, float o stringhe. Questo presupposto causa problemi quando si desidera passare una stringa che assomiglia a & Quot; 0096 & Quot ;, RPC2 la convertirà in una perché sembra un numero intero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top