soap lite передает строковый аргумент

#web-services #perl #soap

#веб-сервисы #perl #soap

Вопрос:

У меня проблема с передачей строкового аргумента с использованием 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 вооооо! Хорошего дня…

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

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

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

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

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

Ответ №1:

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 это будет ответ на вызов, преобразованный в hashref через XML::Simple , который может быть всем, что вам нужно. $trace Объект удобен для просмотра того, как выглядит необработанный XML-ответ.

Комментарии:

1. Спасибо за ваш ответ. Я не эксперт по Perl. Я нашел SOAP::WSDL здесь search.cpan.org /~mkutter/SOAP-WSDL-2.00.10 . Как я могу его установить? ppm не отображает его в списке?

2. Я работаю над сборкой Windows и perl. PL не работает, потому что он ищет gcc и другие вещи. В идеале я хочу установить пакет, как я сделал для SOAP: Lite, с ppm.

3. О, извините, просто пользуюсь возможностью высказаться SOAP::Lite . Возможно, SOAP::WSDL недоступен для ActivePerl. Вы видите XML::Compile::SOAP ? Я обновлю свой ответ, чтобы использовать это, если это так.

4. Я получил другую ошибку. Пожалуйста, взгляните на мою ПРАВКУ в сообщении

5. Смотрите редактирование. Вам не нужно устанавливать эту переменную среды, и я не уверен, как часто строка, разделенная точкой с запятой, интерпретируется как список в библиотеках Perl или Python.

Ответ №2:

К сожалению, я не вижу ваш 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"};
});