2012-04-30 10 views
3

SOAP::WSDLと別の会社のカスタムWSDLファイルを使用しています。彼らが私のために変更を加え、私のモジュールを作り直すたびに、何かが壊れます。 SOAPサーバーに送信される実際の要求にアクセスするための適切な方法が見つからないため、問題を見つけることはやや面倒です。Perl:SOAP :: WSDLオブジェクトからの完全なリクエストの取得

これまでのところ、リクエストに到達する唯一の方法は、tcpdumpをwiresharkと組み合わせてリクエストと結果を抽出することでした。それはうまくいきますが、私がdevマシンにroot権限を持っていないので、私はそれをしたい毎回の管理者を取得しなければなりません。 SOAP::WSDLのものの中のHTTP::Requestオブジェクトにアクセスする別の方法がなければならないと感じています。しかし、サーバーが障害を返す場合、私は応答オブジェクトも持っていませんが、むしろ要求と目に見える関係がないSOAP::WSDL::SOAP::Typelib::Fault11オブジェクトです。

また、デバッガを使用しようとしましたが、実際のリクエスト部分を見つけるのに問題があります。私はまだ複雑な数のパッケージの中の特定の部分にスキップするようにデバッガに指示する方法を理解していません。

+0

モジュールは分かっていませんが、Data :: DumperまたはData :: Dumpでオブジェクト全体をダンプしようとしましたか? Dumper $ soap_resを印刷するだけです。 .. –

+1

@ØyvindSkaar: 'SOAP :: WSDL'が作成するすべてのオブジェクトが' Class :: Std :: Fast :: Storable'オブジェクトであるため、動作しません。ダンプすると、$ VAR1 = bless(do {\(my $ o = 157)}、 'SOAP :: WSDL :: SOAP :: Typelib :: Fault11'); ' – simbabque

答えて

0

少なくとも、生成されたXMLコードを印刷する方法が見つかりました。

まず、raina77owが提案したように、SOAP::WSDL::Clientを見ました。しかし、それは私が必要なものではありませんでした。しかし、私はSOAP::WSDL::Factory::Serializerを見つけました。そこでは、それは言う:

シリアライザオブジェクトもset_serializerメソッドを使用して、WSDL ::クライアント :: SOAPに直接渡すことができます。

少しそわそわと私はSOAP::WSDLで使用されるデフォルトのシリアライザですSOAP::WSDL::Serializer::XSDのラッパークラスを思い付きました。コードを見ても助かりました。

ここに私が書いたモジュールがあります。これはSOAP::WSDL::Serializer::XSDを基本クラスとして使用し、newserializeのメソッドをオーバーロードします。引数はnewにしか渡されませんが、返されたXMLはserializeから取得され、デバッグには十分です。私はそれをどこからでも簡単に入手できる方法があるかどうかはわかりません。

my $serializer = MySerializer->new(); 
$self->{'_interface'} = Lib::Interfaces::MyInterface->new(); 
$self->{'_interface'}->set_serializer($serializer); # comment out to deactivate 

それは無効化するのは簡単です:

package MySerializer; 
use strict; 
use warnings; 
use base qw(SOAP::WSDL::Serializer::XSD); 

sub new { 
    my $self = shift; 
    my $class = ref($self) || $self; 
    return $self if ref $self; 

    # Create the base object and return it 
    my $base_object = $class->SUPER::new(@_); 
    return bless ($base_object, $class); 
} 

sub serialize { 
    my ($self, $args_of_ref) = @_; 

    # This is basically a wrapper function that calls the real Serializer's 
    # serialize-method and grabs and prints the returned XML before it 
    # giving it back to the caller 

    my $xml = ref($self)->SUPER::serialize($args_of_ref); 
    print "\n\n$xml\n\n"; # here we go 
    return $xml; 
} 

1; 

そして、ここでは、私はそれを呼び出す方法です。 set_serializer行にのみコメントを入力してください。

もちろん、XMLのブロックをコマンドラインに印刷することはあまり美しいものではありませんが、ジョブは完了します。私はそれを必要としているが、なぜコーディング/テストなので、これはうまくいくと思う。

+0

https://metacpan.org/module/MKUTTER/SOAP-WSDL-2.00.99_3/lib/SOAP/WSDL/Transport/Loopback.pm – simbabque

2

SOAP::WSDL::Clientトレース方法を使用しようとしましたか?outputxml特にですか?サーバーに送信される生のSOAPエンベロープを返します。

またSOAP::WSDLパッケージのno_dispatch設定方法を使用することができます。

はセット、呼び出しは()の代わりに SOAPサービスへのSOAP呼び出しをディスパッチの平野要求XMLを返すとき。テスト/デバッグに便利です。

+0

というようになります。そうすれば、完全なSOAP-Result XMLが得られます。フォールト・リザルトで '$ res-> serialize'を実行することでそれを得ることができたので、それは悪くないが役に立たない。 – simbabque

+0

あなたは私を正しい道に導いた。 8時間の制限があるときに自分の解決策を投稿します。ありがとう。 :) – simbabque

4

これは私自身も同じ問題を抱えていました。答えはraina77owが挙げた両方のオプションを使用していることがわかりました。

$service->outputxml(1); 

全体SOAPエンベロープXMLを返し、これはno_dispatchセットと

$service->no_dispatch(1); 

と組み合わせる必要があり、SOAPリクエストではなく、要求からの応答を、印刷されます。うまくいけば、これは他人を助けることができる。

関連する問題