Pergunta

Eu estou tentando usar um servidor XML-RPC no meu Drupal (PHP) backend para tornar mais fácil para o meu backend Perl para falar com ele. No entanto, eu correr em um problema e eu não tenho certeza que as partes, se houver, são bugs. Essencialmente, algumas das variáveis ??que eu preciso para passar para Drupal são cadeias que às vezes são cordas cheias de números e o servidor Drupal XML-RPC está retornando um erro que, quando uma corda está cheio de números que não está devidamente formado.

código My Perl é algo como isto no 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;

A saída é:

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

Quando eu tenho a impressão servidor XML-RPC Drupal os dados que recebe, noto que o segundo argumento é digitado como i4:

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

Eu acho que quando Drupal, em seguida, termina o processamento do item, ele está escrevendo essa variável como um int em vez de uma string. Isto significa que quando Drupal depois tenta verificar se o valor da variável é adequadamente formado por uma seqüência, os is_string PHP função retorna falso.

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.'));
  }
}

O que eu não tenho certeza é de que lado da divisão das mentiras problema ou se há algo mais que eu deveria estar usando. Caso o pedido do lado do Perl estar escrevendo o conteúdo como uma cadeia em vez de i4 ou é o lado Drupal do pedido demasiado rigorosos para o tipo de corda? Meu palpite é que a questão é a última, mas eu não sei o suficiente sobre como um servidor XML-RPC é suposto trabalho de saber com certeza.

Foi útil?

Solução

Eu não tenho nenhuma experiência com o pacote XML :: RPC, mas eu sou o autor do RPC :: XML CPAN módulo. Tal como acontece com o pacote Frontier, eu fornecer uma maneira de forçar um valor em um tipo específico quando de outra forma padrão para outra coisa.

Se eu tivesse que adivinhar, diria que o pacote que você está usando simples faz uma correspondência de expressão regular sobre os dados para decidir como escrevê-lo. Eu tive um problema semelhante com o meu pacote, e dada a forma como os valores alças Perl escalares a única maneira real em torno é para forçá-lo com a declaração explícita. Como um respondente anterior gótico, o valor em questão é realmente fora do alcance do tipo (que é um valor de 32 bits com sinal). Assim, mesmo se você tinha a intenção que ele seja um valor inteiro, teria sido inválida que diz respeito à especificação XML-RPC.

Eu recomendaria comutação para um dos outros pacotes XML-RPC, que têm formas mais claras de dados explicitamente digitação. De acordo com a documentação para XML :: RPC, é possível forçar a digitação de dados, mas eu achei que fosse claro e não muito bem explicado.

Outras dicas

O número 9876352345 é grande demais para caber em um inteiro de 32 bits. Isso pode causar o problema.

você está usando fronteira? talvez você poderia declarar a string explicitamente?

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

Informações no docs cliente :

Por padrão, você pode passar valores comuns Perl (escalares) a serem codificados. RPC2 converte-os automaticamente para tipos XML-RPC se olham como um inteiro, float, ou como uma string. Esta suposição causa problemas quando você quer passar uma string que se parece com "0096", RPC2 irá convertê-lo em um porque parece que um número inteiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top