簡體   English   中英

Perl - SOAP :: WSDL - wsdl2perl.pl

[英]Perl - SOAP::WSDL - wsdl2perl.pl

我們正在研究perl中的系統,該系統必須與提供SOAP端點的多個Web服務進行通信。 它們提供WSDL文件來描述服務(在C#.Net中,“添加服務引用”將使用這些)。 我們使用wsdl2perl.pl將這些文件導入perl模塊。

一切正常,除非服務返回故障。

我們稱這樣的服務為:

my $service = OurInterfaces::OurService::OurPort->new();
my $result = $service->ourMethod({ someParameter => '1234' });
die $result->get_faultstring()->serialize() if not $result;

當我們嘗試訪問故障字符串時,我們的perl腳本就會死掉:

<Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Error deserializing message: Cannot resolve class for Fault/detail/Errors/ErrorDetail via UPSRateTypemaps::RateService at /usr/lib/perl5/site_perl/5.8.8/SOAP/WSDL/Expat/MessageParser.pm line 147.
at line 1 at /usr/lib/perl5/site_perl/5.8.8/SOAP/WSDL/Expat/Base.pm line 82
. 
Message was: 
&lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;&lt;soapenv:Header/&gt;&lt;soapenv:Body&gt;&lt;soapenv:Fault&gt;&lt;faultcode&gt;Client&lt;/faultcode&gt;&lt;faultstring&gt;An exception has been raised as a result of client data.&lt;/faultstring&gt;&lt;detail&gt;&lt;err:Errors xmlns:err=&quot;http://www.ups.com/schema/xpci/1.0/error&quot;&gt;&lt;err:ErrorDetail&gt;&lt;err:Severity&gt;Hard&lt;/err:Severity&gt;&lt;err:PrimaryErrorCode&gt;&lt;err:Code&gt;10001&lt;/err:Code&gt;&lt;err:Description&gt;The XML document is not well formed&lt;/err:Description&gt;&lt;err:Digest&gt;&amp;lt;/RateRequest&gt; does not close tag &amp;lt;Request&gt;.&lt;/err:Digest&gt;&lt;/err:PrimaryErrorCode&gt;&lt;err:Location/&gt;&lt;/err:ErrorDetail&gt;&lt;/err:Errors&gt;&lt;/detail&gt;&lt;/soapenv:Fault&gt;&lt;/soapenv:Body&gt;&lt;/soapenv:Envelope&gt;</faultstring><faultactor>urn:localhost</faultactor></Fault>

似乎為故障返回的XML未正確映射到類(Class :: Std)。 我們該如何解決這個問題?

還有沒有文章描述我們需要做什么來映射錯誤消息? 在大多數情況下,wsdl2perl.pl對我們來說簡直就是魔術

既然沒有答案。 我將發布我們所做的工作以使其正常運行。

我們打開了包含our $typemap_1Typemap.pm文件,並添加了這樣的行:

'Fault/detail' => 'UPSTrackElements::Errors'
'Fault/detail/Errors' => 'UPSTrackElements::Errors',
'Fault/detail/Errors/ErrorDetail' => 'UPSTrackTypes::ErrorDetailType',
...

wsdl2perl.pl導入了我們需要的錯誤類,但它沒有在typemap文件中正確地連接它們。 通常,我們必須將'Fault / detail'附加到它映射所有Error類的前面。 我不確定為什么wsdl2perl.pl無法正確映射它們,當它顯然沒有生成類的問題時。

我們必須為fault xml中的每個字段填寫適當的XPath。 它現在對我們有用,但是很難弄明白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM