#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"};
});