Perl - SOAP :: WSDL - wsdl2perl.pl - PullRequest
       17

Perl - SOAP :: WSDL - wsdl2perl.pl

3 голосов
/ 05 августа 2011

Мы работаем над системой на Perl, которая должна взаимодействовать с несколькими веб-сервисами, которые предоставляют конечные точки SOAP для работы. Они предоставляют файлы 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 просто магия для нас.

1 Ответ

2 голосов
/ 09 августа 2011

Поскольку ответов пока нет. Я опубликую то, что мы сделали, чтобы оно заработало.

Мы открыли файл Typemap.pm с our $typemap_1 и добавили следующие строки:

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

wsdl2perl.pl импортировал нужные нам классы ошибок, но он не подключил их должным образом в файле карты типов. В общем, мы должны были добавить 'Fault / detail' в начало, где он отображал все наши классы Error. Я не уверен, почему wsdl2perl.pl не смог правильно отобразить их, когда, очевидно, не было проблем с генерацией классов.

Мы должны были заполнить соответствующий XPath для каждого поля в xml ошибки. Сейчас это работает для нас, но было довольно уродливо, чтобы понять.

...