3

私はSOAP::WSDL、他社のカスタム WSDL ファイルを使用しています。彼らが私のために変更を加え、モジュールを再作成するたびに、何かが壊れます。SOAP サーバーに送信される実際の要求にアクセスする適切な方法が見つからないため、問題を見つけるのはかなり面倒です。

これまでのところ、リクエストに到達する唯一の方法は、tcpdump を Wireshark と組み合わせて使用​​して、リクエストと結果を抽出することでした。それは機能しますが、開発マシンでルート権限を持っていないため、それを行うたびに管理者を取得する必要があります。モノのHTTP::Request中のオブジェクトに到達するには、別の方法があるに違いないと思います。SOAP::WSDLしかし、サーバーが障害を返した場合、私は応答オブジェクトさえ持っていませんがSOAP::WSDL::SOAP::Typelib::Fault11、要求との目に見える関係を持たないオブジェクトを持っています。

デバッガーも使用してみましたが、実際のリクエスト部分を見つけるのに苦労しています。複雑な数のパッケージの奥深くにある特定の部分にスキップするようにデバッガーに指示する方法をまだ理解していません。

4

3 に答える 3

4

私はこれに出くわし、同じ問題を抱えていました。答えは、raina77ow がリストした両方のオプションを使用することであることがわかりました。

$service->outputxml(1);

SOAPエンベロープxml全体を返しますが、これは次と組み合わせる必要があります

$service->no_dispatch(1);

no_dispatch を設定すると、リクエストからの応答ではなく、SOAP リクエストが出力されます。うまくいけば、これは他の人を助けることができます.

于 2012-10-15T19:14:10.130 に答える
2

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

SOAP::WSDLパッケージのno_dispatch構成メソッドを使用することもできます。

設定すると、call() は、SOAP 呼び出しを SOAP サービスにディスパッチする代わりに、プレーンな要求 XML を返します。テスト/デバッグに便利です。

于 2012-04-30T09:32:01.370 に答える
0

少なくとも、生成された XML コードを出力する方法を見つけました。

まず、raina77ow が提案したように、 SOAP::WSDL::Clientを調べました。しかし、それは私が必要としていたものではありませんでした。しかし、その後、SOAP::WSDL::Factory::Serializerに出会いました。そこには、次のように書かれています。

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

少しいじって、 SOAP::WSDL::Serializer::XSDのラッパー クラスを思いつきました。これは、 SOAP::WSDLで使用されるデフォルトのシリアライザーです。コードを見ることも役に立ちました。

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

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;

そして、これが私がそれを呼び出す方法です:

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

無効にするのは簡単です。行にコメントを入れるだけset_serializerです。

もちろん、XML のブロックをコマンド ラインに出力するのはあまりきれいではありませんが、仕事は完了します。コーディング/テストのためにたまにしか必要ないので、これで問題ないと思います。

于 2012-05-02T07:17:07.503 に答える