2011-11-08 21 views
1

Perlを使用して文字列引数を渡すときに問題があります。soap lite渡し文字列引数

に次のコード

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

結果ヌル挨拶!

同様の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モニタは問題になる可能性がどのようなPythonの

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

の場合に存在しているPerlの

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

の場合にはarg0には存在しないことを示して?

なぜPerlとSOAPクライアントをPythonに比べて実装するのはとても複雑ですか?

EDIT: SOLUTION

最後に、次の解決策は、

#!/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を働いていることinfuriatingly悪いことができます。あなたは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レスポンスがどのように見えるかを見るのに便利です。

+0

ご回答ありがとうございます。私はPerlの専門家ではない。 SOAP :: WSDLはhttp://search.cpan.org/~mkutter/SOAP-WSDL-2.00.10/にあります。どうすればインストールできますか? ppmではリストに表示されませんか? –

+0

私はgccやその他のものを探しているので、Windowsとperl Build.PLで動作していません。理想的には、私はppmでSOAP:Liteと同じようにパッケージをインストールしたいと考えています。 –

+0

ああ、申し訳ありませんが、単に 'SOAP :: Lite'について通風する機会を得ています。おそらく 'SOAP :: WSDL'はActivePerlでは利用できません。あなたは 'XML :: Compile :: SOAP'を見ますか?私はそれを使用するために私の答えを更新します。 –

1

残念ながら、私はあなたの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"}; 
}); 
関連する問題