Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

Dear Perl Monks

Please help me to solve a SOAP::Lite + Moose object problem.

I am trying to create a SOAP server which serves a Moose object as a Web service. Both my server & client is in perl. When I get the perl object from client side, Only first call to any instance method works after that object (which I got from SOAP server) scrambles. So subsequent instance method calls fails.

Please have a look at my example code to reproduce the problem.

soap-ser.pl

#!perl package DemoService; use strict; use warnings; use Moose; use namespace::autoclean; has 'size',is=>'rw',default=>20; #Do it for all classes so Moose will create fast object creation, so a +pplication runs faster __PACKAGE__->meta->make_immutable(); 1; package main; use strict; use warnings; use SOAP::Transport::HTTP; use Compress::Zlib; use FindBin qw($RealBin); use lib "$RealBin"; $|=1; my $httpSoapDaemon = SOAP::Transport::HTTP::Daemon->new(LocalAddr => ' +localhost',Reuse => 1,LocalPort => 8081); #Will be encrypted if message > 100 $httpSoapDaemon->options({compress_threshold => 500}); #Dispatch calls to particular class #$httpSoapDaemon-> objects_by_reference(qw(DemoService)); $httpSoapDaemon->dispatch_to(qw(DemoService)); print "\n Server started. URL: ", $httpSoapDaemon->url(); #Daemon started here $httpSoapDaemon->handle();

soap-cli.pl

#!perl use strict; use warnings; use SOAP::Lite; use Data::Dumper; my $result; my $soapService = SOAP::Lite->new(); #Specify which class should be called for the service, i.e namespace $soapService->uri('DemoService'); #specify service provider location, Initial timeout should be very min +imal $soapService->transport()->proxy('http://127.0.0.1:8081/',timeout=>600 +,keep_alive =>1); #No need to have HTTP proxy #transport returns underlaying LWP::UserAgent object $soapService->transport()->no_proxy('127.0.0.1','localhost'); #Get Object, To call constructor use explicit call function, DO not us +e autodispatch. my $obj = $soapService->call('new'=>())->result(); #Modify the Obj to Hash ref $obj = SOAP::Data->value($obj); print "\n OBJ-State:",Dumper($obj); print "\n"; #Call instance methods #Pass the obj as first argument so it will go as $self $result = $soapService->call(size=>($obj,45)); unless ($result->fault) { print "\n Size is ::",$result->result(); # Method result print "\n New-OBJ-State:",Dumper($obj); } #So far it is good. Call the size again to set another value #This call fails because 'New-OBJ-State' is scrambled :( #Got following error # ERROR: soap:Server, Can't use string ("DemoService") as a HASH ref w +hile "strict refs" in use at accessor DemoService::size (defined at s +oap-ser.pl line 8) line 3. $result = $soapService->call(size=>($obj,20)); unless ($result->fault) { print "\n Size is ::",$result->result(); # Method result print "\n OBJ-State:",Dumper($obj); } else { print "\n ERROR: ", join ', ', $result->faultcode, $result->faultstring, $result->faultdetail; }

First we need to start SOAP server by running perl soap-ser.pl
Then start the client by running perl soap-cli.pl

I get following output & error from soap-cli.pl

E:\temp>perl soap-cli.pl OBJ-State:$VAR1 = bless( { '_signature' => [], '_value' => [ bless( { 'size' => '20' }, 'DemoService' ) ], '_attr' => {} }, 'SOAP::Data' ); Size is ::45 New-OBJ-State:$VAR1 = bless( { '_name' => undef, '_signature' => [ 'DemoService∟DemoService' ], '_value' => [ \bless( { '_signature' => [], '_value' => [ bless( { '_nam +e' => 'size', '_sig +nature' => [], '_val +ue' => [ + '45' + ], '_pre +fix' => '', '_att +r' => { + 'xsi:type' => 'xsd:int', + '{http://www.w3.org/2001/XMLSchema-instance}type' => '{http:/ +/ www.w3.org/2001/XMLSchema}int' + } }, 'SOA +P::Data' ) ], '_attr' => {} }, 'SOAP::Data' ) ], '_attr' => {} }, 'SOAP::Data' ); ERROR: soap:Server, Can't use string ("DemoService") as a HASH ref wh +ile "strict refs" in use at accessor DemoService::size (defined at so +a p-ser.pl line 8) line 3. E:\temp>

I am using ActivePerl 5.14 (x86), SOAP::Lite 0.715

What am I doing wrong?

Thanks & Regards,
Bakkiaraj M
My Perl Gtk2 technology demo project - http://code.google.com/p/saaral-soft-search-spider/ , contributions are welcome.


In reply to Who is scrambling my SOAP (Moose) object? by sam_bakki

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    [1nickt]: marto would like to hear that. Of course he speaks very deliberately and dramatically, allowing pauses between words, so if anybody could pull it off it would be him, or someone impersonating him ...
    [Eily]: Discipulus that's a chess joke BTW right? Because bishops don't walk straight :D
    [choroba]: stop making chessy jokes about bishops!
    [choroba]: I mean cheesy
    [LanX]: lol
    [ambrus]: no, the chess bishop itself is a joke on real bi-shops
    [ambrus]: or at least on the stereotype of bi-shops
    [choroba]: we call chess bishops "archers"
    [Eily]: choroba sorry, I had to get that off my chess
    [ambrus]: chess certainly hasn't started those stereotypes, like how kings aren't that powerful but has convinced their whole country to work for them, etc. it's just poured them to a nice clean form that would easily get propagated.

    How do I use this? | Other CB clients
    Other Users?
    Others surveying the Monastery: (14)
    As of 2017-09-26 12:13 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?
      During the recent solar eclipse, I:









      Results (294 votes). Check out past polls.

      Notices?