аргумент строки передачи - PullRequest
1 голос
/ 08 ноября 2011

У меня проблема с передачей строкового аргумента с использованием Perl.Следующий код

#!/usr/bin/perl -w
use SOAP::Lite;
my $service = SOAP::Lite->service('http://localhost:8080/greeting?wsdl');
print $service->greetClient('perl wooooo'), "\n";

Результат

Приветствие null !Хорошего дня ...

Аналогичный код Python

from suds.client import Client
client = Client('http://localhost:8080/greeting?wsdl')
print client.service.greetClient('python wooooo')

отлично работает

Приветствие python wooooo !Хорошего дня ...

Я пытался установить разные кодировки

print $service->encoding('utf-8')->greetClient("perl wooooo"), "\n";

с тем же результатом.

Монитор SOAP показывает, что нетarg0 в случае Perl

<greetClient xsi:nil="true"  xsi:type="tns:greetClient" />

, который присутствует в случае Python

<ns0:greetClient>
  <arg0>python wooooo</arg0>
</ns0:greetClient>

В чем может быть проблема?

Почему это так сложно реализоватьSOAP-клиент с Perl по сравнению с Python?

РЕДАКТИРОВАТЬ: РЕШЕНИЕ

Наконец следующее решение работает

#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Compile::SOAP11;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;

my $soap = XML::Compile::WSDL11->new('c:/temp/greeting.wsdl');
my $call = $soap->compileClient('greetClient');
print $call->(arg0 => 'perl wooooo'){'greetClientResponse'}{'return'}, "\n";

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

К сожалению, я не вижу ваш WSDL.

Но что касается SOAP :: Lite, я не вижу, чтобы вы настраивали ни proxy (конечная точка), ни uri.

Вам, вероятно, также придется изменить поведение on_action. По умолчанию SOAP::Lite хочет использовать конкатенацию '#'.

Так что что-то в этом роде может сработать.

$service->proxy( $uri_of_my_end_point );
$service->uri( $schema_namespace );
$service->on_action( sub {
    my ( $uri, $method ) = @_;
    my $slash = $uri =~ m{/$} ? '' : '/';
    return qq{"$uri$slash$method"};
});
1 голос
/ 08 ноября 2011

SOAP::Lite может быть ужасно плохим.Вы можете попробовать XML::Compile::SOAP:

use strict;
use warnings;
use XML::Compile::SOAP11;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;

my $soap = XML::Compile::WSDL11->new(
    'http://localhost:8080/greeting?wsdl',
    schema_dirs => [
        'c:/soft/Perl/site/lib/XML/Compile/SOAP11/xsd'
        'c:/soft/Perl/site/lib/XML/Compile/XOP/xsd'
        'c:/soft/Perl/site/lib/XML/Compile/xsd'
    ]
);
$soap->compileCalls;
my ( $response, $trace ) = $soap->call( 'greetClient', arg0 => 'perl wooooo' );
$trace->printResponse;

$response будет ответом на вызов, преобразованным в хеш-код с помощью XML::Simple, что может быть всем, что вам нужно.Объект $trace удобен для просмотра того, как выглядит необработанный XML-ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...