2008-11-03 8 views
2

필자의 Perl 백엔드에서 PHP-back RPC를 사용하기 쉽도록 XML-RPC 서버를 사용하려고합니다. 그러나 문제가 생겼고 어떤 부분이 버그인지는 확실하지 않습니다. 필자가 드루팔 (Drupal에 전달해야하는 변수 중 일부는 때로는 숫자로 가득 찬 문자열이고 Drupal XML-RPC 서버는 문자열이 숫자로 가득 차면 올바르게 형성되지 않는다는 오류를 반환합니다.XML :: RPC와 Drupal에서 문자열 자릿수를 어떻게 처리해야합니까?

내 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; 

출력은 다음과 같습니다

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

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

나는 그것이 수신 데이터 밖으로 드루팔 XML-RPC 서버 인쇄를 할 때, 나는 두 번째 인수는 I4로 입력되는 것을 알 수

드루팔 (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 대신 문자열로 입력해야합니까, 아니면 문자열 유형에 대해 너무 엄격한 요청의 드루팔 측입니까? 내 생각 엔이 문제는 후자이지만 XML-RPC 서버가 어떻게 작동하는지 확실히 알 수는 없습니다.

답변

0

저는 XML :: RPC 패키지에 대한 경험이 없지만 RPC::XML CPAN 모듈을 작성했습니다. 프론티어 패키지에서와 마찬가지로, 다른 방식으로 기본 설정을 적용 할 때 값을 특정 유형으로 강제 변환하는 방법을 제공합니다.

짐작할 수 있겠지만, 사용하는 패키지가 데이터를 입력하는 방식을 결정하기 위해 정규 표현식 일치를 사용한다고 가정합니다. 내 패키지에 비슷한 문제가 있었고 Perl이 스칼라 값을 처리하는 방식을 감안할 때 명시적인 선언을 사용하여 강제로 스칼라 값을 처리하는 것이 유일한 방법입니다. 앞의 응답자가 지적했듯이 문제의 값은 실제로는 <i4> 유형 (부호가있는 32 비트 값)의 범위를 벗어납니다. 따라서 정수 값으로 사용하려는 경우에도 XML-RPC 사양과 관련하여 유효하지 않았을 것입니다.

명시 적으로 데이터를 입력하는 명확한 방법이있는 다른 XML-RPC 패키지로 전환하는 것이 좋습니다.XML에 대한 문서 :: RPC에 따르면 데이터 입력을 강제 할 수는 있지만 명확하지 않으며 잘 설명되지 않은 것으로 나타났습니다.

+0

고마워요! 나는 RPC :: XML 라이브러리를 이전에 사용하고 있었고, 나는 다시 그것으로 바꿀 것이다. –

1

숫자 9876352345이 너무 커서 32 비트 정수에 맞지 않습니다. 문제가 발생할 수 있습니다.

1

국경을 사용하고 계십니까? 아마도 문자열을 명시 적으로 선언 할 수 있습니까? client docs에서

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

정보 : 기본적으로

, 당신은 보통 펄 값 (스칼라)를 통과 할 수는 인코딩합니다. RPC2는 integer, float 또는 문자열처럼 보이는 경우 XML-RPC 유형으로 자동 변환합니다. 이 가정은 "0096"과 같은 문자열을 전달할 때 문제를 일으키고, RPC2는이를 정수로 변환하기 때문에이를 변환합니다.

+0

감사합니다. Owen. 이 유형의 정보는 내가 필요한 것입니다. –

관련 문제