Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

SOAP::Lite Not returning expected results

by Ovid (Cardinal)
on Oct 13, 2004 at 18:19 UTC ( [id://398955]=perlquestion: print w/replies, xml ) Need Help??

Ovid has asked for the wisdom of the Perl Monks concerning the following question:

I used the program stubmaker.pl that's distributed with SOAP::Lite to create an SOAP client and I can't seem to retrieve the data correctly. The relative snippet of code is this:

my $som = $self ->endpoint($method{endpoint}) ->uri($method{uri}) ->on_action( sub { qq/"$method{soapaction}"/ } ) ->call($method => map { @templates ? shift(@templates)->value( +$_) : $_ } @_); return $som unless UNIVERSAL::isa($som => 'SOAP::SOM'); return wantarray ? $som->paramsall : $som->result;

I used Data::Dumper on the SOAP::SOM ($som) object that was returned and buried deep in the data structure is the data that I need. $self->call is returning a SOAP::SOM object and I'm calling it in list context, so it's the $som->paramsall method which is failing. It returns the following data structure:

@movies = ( { 'Movies' => { 'Movie' => '' } } );

The XML returned by the SOAP call resembles the following (with many thousands of movies cut out and this is actually returned on one line.)

<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetMoviesResponse xmlns="http://www.dtmovies.com/websvcs/"> <GetMoviesResult> <Movies xmlns=""> <Movie Title="10 Things I Hate About You" FilmID="474" /> <Movie Title="102 Dalmatians" FilmID="912" /> <Movie Title="13 Going on 30" FilmID="1496" /> <Movie Title="15 Minutes" FilmID="966" /> </Movies> </GetMoviesResult> </GetMoviesResponse> </soap:Body> </soap:Envelope>

Do you see anything wrong with the above? Would providing a snippet of the (long) data structure in $som be useful? Should I just run my head through a meat grinder instead? Inquiring minds want to know.

I'm using SOAP::Lite version 0.60.

Cross-posted to the SOAP::Lite mailing list.

Update: I've developed a workaround by setting $self->outputxml(1) and using XML::Simple to parse the data. I'd rather not do that but at least it works.

Cheers,
Ovid

New address of my CGI Course.

Replies are listed 'Best First'.
Re: SOAP::Lite Not returning expected results
by rdfield (Priest) on Oct 14, 2004 at 08:42 UTC
    I've had lots of problems with SOAP::Lite 0.60 screwing up the representation of "complex" data structures, and have reverted to 0.55.

    For example, say my SOAP server returns a value containing an empty hash,  return {};, in 0.60 the client sees '' (the empty string), whereas 0.55 returns {} as expected.

    rdfield

Re: SOAP::Lite Not returning expected results
by PodMaster (Abbot) on Oct 14, 2004 at 03:49 UTC
    What would've been useful is a runnable snippet, something like
    use SOAP::Lite; use strict; use warnings; my $sd = new SOAP::Deserializer(); my $xml = do { local $_=<<'__THE__SOAP__';s/^\s+//;s/\s+$//;$_ }; <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetMoviesResponse xmlns="http://www.dtmovies.com/websvcs/"> <GetMoviesResult> <Movies xmlns=""> <Movie Title="10 Things I Hate About You" FilmID="474" /> <Movie Title="102 Dalmatians" FilmID="912" /> <Movie Title="13 Going on 30" FilmID="1496" /> <Movie Title="15 Minutes" FilmID="966" /> </Movies> </GetMoviesResult> </GetMoviesResponse> </soap:Body> </soap:Envelope> __THE__SOAP__ my $som = $sd->deserialize($xml); use Data::Dumper; $Data::Dumper::Indent=1; #print Dumper( $sp, $parsed ),$/; #warn Dumper( $som ),$/; warn "$_ => ", Dumper( $som->$_() ),$/ for qw[ paramsall result ]; # root envelope header headers body fault method result paramsin para +msout ]; __END__ paramsall => $VAR1 = { 'Movies' => { 'Movie' => '' } }; result => $VAR1 = { 'Movies' => { 'Movie' => '' } };
    It looks to me like a bug in SOAP::Lite, in particular in its XPATH implementation (sub SOAP::SOM::valueof ...).
    If     paramsall => '/Envelope/Body/[1]/[>0]', is correct, SOAP::Lite doesn't do the right thing.

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

Re: SOAP::Lite Not returning expected results
by SpanishInquisition (Pilgrim) on Oct 14, 2004 at 16:19 UTC
    Perhaps OT, but a few observations on SOAP::Lite.

    (a) The version of SOAP isn't up to date with the latest SOAP design-by-committee-evil-standard, so it doesn't work with a lot of SOAP implementations. It would be nice if SOAP::Lite would support multiple SOAP versions.

    (b) A lot of times the SOAP you get is kind of fugly, so it doesn't work there either. Plus, complicated SOAP leads to really complicated code, and I don't like SOAP making my code too complicated.

    I ended up parsing Soap with XML::Simple and sending requessts with XML created as strings by a functioanl-programming technique and trasmitted by LWP. So, anyhow, roll your own SOAP on a rope... the XML generation by functions was really really awesome and basically allowed you to write xml like...

    $response = $Soapy->send($server,$resource,$meth_name, xml( xml_foo( xml_zorp('state',3), xml_gluz('foobar',$alpha), ), xml_ooooog(72,36,48,'hike'), ), );

    Very lispish. Reading that was much easier than reading all of the "ac:" and "as:" stuff once I was done with the SOAP generator engine. Unfortunately, as it was done within the confines of corporate America, I can't release Soapy.pm -- but I wish I could.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://398955]
Approved by Limbic~Region
Front-paged by cLive ;-)
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (4)
As of 2025-06-23 12:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.