2012-04-30 33 views
3

我正在使用SOAP::WSDL和另一家公司的自定義WSDL文件。每次他們爲我做出改變,然後重新創建我的模塊時,就會發生一些事情。查找問題相當乏味,因爲我沒有找到正確的方式來訪問發送到SOAP服務器的實際請求。Perl:從SOAP :: WSDL對象獲取完整請求

到目前爲止,請求的唯一方法是使用tcpdump和wireshark一起提取請求和結果。這是有效的,但由於我沒有開發機器上的root權限,每次我想要這樣做都必須獲得管理員權限。我覺得在SOAP::WSDL這個東西里面一定有另外一種方法去訪問HTTP::Request對象。但是,如果服務器返回一個錯誤,我甚至沒有響應對象,而是一個與請求沒有明顯關係的SOAP::WSDL::SOAP::Typelib::Fault11對象。

我也試過使用調試器,但我在查找實際的請求部分時遇到了問題。我還沒有理解如何告訴debuger跳到複雜數量的軟件包內部的特定部分。

+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代碼。

首先,我看着SOAP::WSDL::Client as raina77ow建議。雖然這不是我所需要的。但後來我碰到了SOAP::WSDL::Factory::Serializer。在那裏,它說:

串行器對象也可以通過使用set_serializer方法直接傳遞給SOAP :: WSDL :: Client 。

有點坐立不安,我想出了一個包裝類SOAP::WSDL::Serializer::XSD這是SOAP::WSDL使用默認的序列。代碼看起來也有幫助。

這是我寫的模塊。它使用SOAP::WSDL::Serializer::XSD作爲基類,並重載newserialize方法。雖然它僅將參數傳遞給new,但它會從serialize獲取返回的XML並將其打印出來,這足以進行調試。我不確定是否有辦法將它放在我可以輕易從中獲得的地方。

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塊打印到命令行並不是很漂亮,但它可以完成工作。我只需要一段時間,爲什麼編碼/測試,所以這很好,我猜。

+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配置方法:

置位時,()調用返回平原請求XML而不是調度 的SOAP調用SOAP服務。方便測試/調試。

+0

有趣。這樣我就可以得到完整的SOAP-Result XML。不錯,但也沒有幫助,因爲我可以通過在故障結果中執行'$ res-> serialize'來獲得。 – simbabque

+0

你讓我走上了正確的軌道。 8小時限制啓動後,將發佈我自己的解決方案。謝謝。 :) – simbabque

4

我偶然發現了這個,自己也有同樣的問題。我發現答案是使用raina77ow列出的兩個選項。

$service->outputxml(1); 

返回整個SOAP信封XML,但是這需要,而不是從所述請求的回覆與

$service->no_dispatch(1); 

隨着no_dispatch集,SOAP請求被印刷組合,。希望這可以幫助其他人。