Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

SOAP::Lite & WSDL Problem

by rr2000 (Novice)
on Aug 27, 2008 at 08:16 UTC ( #707107=perlquestion: print w/ replies, xml ) Need Help??
rr2000 has asked for the wisdom of the Perl Monks concerning the following question:

I wrote this simple code to test a WSDL service:
use SOAP::Lite; print SOAP::Lite -> service('http://www.webservicex.com/globalweather.asmx?WSDL') -> GetCitiesByCountry('Singapore');
but when I run it, all I get is an empty output:
$ perl -w weathertest.pl $
No error or anything! So I suppose it's connecting but method call is not quite right. Any1 know what's wrong? I use the latest SOAP::Lite version. PERL is v5.8.8. TIA!

Comment on SOAP::Lite & WSDL Problem
Select or Download Code
Replies are listed 'Best First'.
Re: SOAP::Lite & WSDL Problem
by ForgotPasswordAgain (Deacon) on Aug 27, 2008 at 08:32 UTC

    You can debug a bit:

    ... use SOAP::Lite +trace => 'all'; ... SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 500 Internal Ser +ver Error. ... <soap:Fault> <faultcode>soap:VersionMismatch</faultcode> <faultstring>System.Web.Services.Protocols.SoapException: Possib +le SOAP version mismatch: Envelope namespace http://schemas.xmlsoap.o +rg/wsdl/soap/ was unexpected. Expecting http://schemas.xmlsoap.org/so +ap/envelope/. at System.Web.Services.Protocols.SoapServerProtocol.CheckHelperVers +ion() at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters( +) at System.Web.Services.Protocols.WebServiceHandler.Invoke() at System.Web.Services.Protocols.WebServiceHandler.CoreProcessReque +st()</faultstring> <detail /> </soap:Fault>

    You might want to look in the "INTEROPERABILITY" section in the SOAP::Lite docs. Note that there's also a SOAP::WSDL module that I've noticed being worked on recently but haven't tried yet.

Re: SOAP::Lite & WSDL Problem
by tilly (Archbishop) on Aug 27, 2008 at 16:04 UTC
    I had a similar problem last year. After trying several things I gave up on doing WSDL in Perl and wrote my project in Java.

    Since then XML::Compile has come on the scene. I have heard better things about its WSDL support than previously Perl modules, but I have not personally tried it. Still it is worth a shot.

Re: SOAP::Lite & WSDL Problem
by Khen1950fx (Canon) on Aug 27, 2008 at 17:39 UTC
    This worked for me:

    #!/usr/bin/perl use strict; use warnings; use SOAP::Lite; use SOAP::WSDL; my $soap = SOAP::Lite->service('http://www.webservicex.net/globalweat +her.asmx?WSDL'); $soap->GetCitiesByCountry('Singapore'); print $soap, "\n";
      "worked" how? It doesn't print anything useful.
Re: SOAP::Lite & WSDL Problem
by Perlbotics (Canon) on Aug 27, 2008 at 18:57 UTC
    Works 'somehow' under perl 5.8.8 (SuSE Linux 10.2).
    Versions: SOAP::Lite v0.60, WSDL v2.00.05

    When dumping the response using Data::Dumper, I get:

    ... 'System.Web.Services.Protocols.SoapException: Server was unable to p +rocess request. ---> System.Data.SqlClient.SqlException: Procedure or + function \'getWCity\' expects parameter \'@CountryName\', which was +not supplied. at WebServicex.GlobalWeather.GetCitiesByCountry(String CountryName) ...

    So, there seems to be a problem with the query or what the WDSL module made with it?

    I guess, you already checked connectivity- and name resolution issues like i.e. telnetting port 80 of 209.162.186.60?

Re: SOAP::Lite & WSDL Problem
by morgon (Deacon) on Nov 29, 2009 at 23:34 UTC
    I have exactly the same problem.

    The thing is that SOAP::Lite uses the wrong namespace in the envelope here.

    The funny thing is that if you do this:

    my $soap = SOAP::Lite->service("http://www.webservicex.net/globalweath +er.asmx?WSDL"); print Dumper($soap->serializer->{_namespaces});
    you can see that the proper namespace is actually registered but it later seems to get overwritten in the serializer...
    Explicitely calling register_ns does not change a thing, so I really think it is a bug.

    I finally got it working (without WSDL alas) like this:

    use strict; use SOAP::Lite +trace => "debug"; my $address = 'http://www.webservicex.net/globalweather.asmx'; my $action = "http://www.webserviceX.NET/GetCitiesByCountry"; my $namespace = 'http://www.webserviceX.NET'; my $call = "GetCitiesByCountry"; my $soap = SOAP::Lite ->uri($namespace) ->on_action(sub { $action } ) ->proxy($address); my $arg = SOAP::Data->name(CountryName => "Singapore"); $soap->call($call => $arg);
    Quite a lot of work for such a simple thing - is this because .NET is quirky or is it that SOAP::Lite (I have 0.710.10) has problems with WSDL (or am I simply being stupid?).
Re: SOAP::Lite & WSDL Problem
by Chewy (Initiate) on Jan 10, 2010 at 19:53 UTC
    I ran into the same problem with a WSDL provided by a Sun Glassfish server, the result is just empty, whereas I expect to get "Hello Chewy" Using python suds this works without problems. My code:
    use SOAP::Lite +trace => "debug"; use SOAP::WSDL; use Data::Dumper; my $soap = SOAP::Lite->service("http://172.16.15.148:8081/Webservice/W +ebserviceService?wsdl"); print Dumper($soap->serializer->{_namespaces}); print "\n\nRESULT:\n".Dumper $soap->hello('Chewy')."\n\n";
    Result (shortened):
    $VAR1 = { 'http://www.w3.org/2001/XMLSchema' => 'xsd', 'http://schemas.xmlsoap.org/soap/encoding/' => 'soapenc', 'http://www.w3.org/2001/XMLSchema-instance' => 'xsi', 'http://schemas.xmlsoap.org/soap/envelope/' => 'soap' }; SOAP::Transport::HTTP::Client::send_receive: POST http://172.16.15.148 +:8081/Webservice/WebserviceService HTTP/1.1 Accept: text/xml Accept: multipart/* Accept: application/soap Content-Length: 567 Content-Type: text/xml; charset=utf-8 SOAPAction: "" __cut__ SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/ +soap/envelope/"><S:Body><ns2:helloResponse xmlns:ns2="http://Webservi +ces/"/></S:Body></S:Envelope> RESULT: $VAR1 = ' ';
    Is there any way I can make Perl use this WSDL. I also used stubmaker.pl (SOAP::Lite) and then using the created packages. However also there the results are empty.
Re: SOAP::Lite & WSDL Problem
by rahed (Scribe) on Aug 28, 2008 at 19:54 UTC
    There are issues with generating a soap call directly from wsdl.

    I get an answer with this code:
    $soap = SOAP::Lite->new( uri => ("http://www.webserviceX.NET"), proxy => ('http://www.webservicex.com/globalweather.asmx') +, ); $soap->on_action(sub{join '/',@_ }); my $city = SOAP::Data->name(CountryName => 'Singapore'); my $som = $soap->GetCitiesByCountry($city); if (my $match = $som->match('/Envelope/Body/GetCitiesByCountryResponse +/')) { print "match is OK: $match\n"; my $result = $som->valueof('//GetCitiesByCountryResponse/GetCitiesBy +CountryResult'); print Dumper($result); } else { print "match not OK: $match\n"; }
    printing...
    match is OK: 1 $VAR1 = '<NewDataSet> <Table> <Country>Singapore</Country> <City>Singapore / Paya Lebar</City> </Table> <Table> <Country>Singapore</Country> <City>Singapore / Changi Airport</City> </Table> </NewDataSet>';
      There are issues with generating a soap call directly from wsdl.

      Could you expand on that? I'm banging my head against this particular brick wall right now...

        To be clearer - I have a service that responds fine to my hand-crafted XML sent using LWP, but b0rks when I try to access it via SOAP::Lite. I suspect the WSDL stuff is the key to what's going wrong, but unfortunately I don't have the 'proxy' URL available to me.
        I saw some people had poor results with generating xml code directly from service description.
        I tried several times to verify and wasn't successful as well but didn't dig into.
        I prefer coding the message through SOAP::Data class manually.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://707107]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (13)
As of 2015-07-07 19:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls