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

HEllo Monks

Back at it again. Trying to figure out how to use a handler. I'm following the example Re^5: SOAP::Lite method with one param. When I add the "request_send" handler I receive an error. If I change the name of the handler to "request_done" or "request_prepare" I don't receive an error.

The error:

Can't locate object method "request" via package "1" (perhaps you forg +ot to load "1"?) at /usr/local/share/perl/5.18.2/LWP/UserAgent.pm lin +e 216.

Actually, this appears to be an issue with LWP::UserAgent

#!/usr/bin/env perl use strict; use warnings; use LWP::UserAgent; use Data::Dumper; my $ua = LWP::UserAgent->new; $ua->add_handler('request_send', \&pp_dump); $ua->post("http://google.com"); sub pp_dump { print Dumper @_; }

This is the SOAP code I was working with

#!/usr/bin/env perl use strict; use warnings; use 5.010; use SOAP::Lite; SOAP::Lite->import(+trace => 'all'); use Data::Dumper; my $client = SOAP::Lite->proxy($proxy) ->ns($namespace, 'foo') ->uri($uri) ->on_action(sub { sprintf '%s', $_[0] }) ->on_fault(sub { my($soap, $result) = @_; die ref $result ? "Fault Code: " . $result->faultcode . "\n" . "Fault String: " . $result->faultstring . "\n" : $soap->transport->status, "\n"; }); my $params = { foo => 'bar', biz => 'baz'}; # does not cause error # $client->transport->add_handler("request_prepare", \&pp_dump ); # causes error $client->transport->add_handler("request_send", \&pp_dump ); my $result = $client->call('my_api_method' => $params); sub pp_dump { print Dumper @_; }

Thanks!

  • Comment on [LWP::UserAgent] 'Can't locate object method "request" via package "1" when attempting to add a hander
  • Select or Download Code

Replies are listed 'Best First'.
Re: [LWP::UserAgent] 'Can't locate object method "request" via package "1" when attempting to add a hander
by Anonymous Monk on Jan 30, 2015 at 00:47 UTC

    Back at it again. ... just guessing

    You're not very good at guessing, I suggest you study the docs some more

    $ perl studythedocs.pl ** POST http://example.com ==> 200 OK (3s) $ perl studythedocs.pl add_handler ** POST http://example.com ==> $VAR1 = bless( { ...**snip**... $VAR3 = $VAR2->{'handlers'}{'request_send'}[0]; Can't call method "request" without a package or object reference at C +:/citrusperl/site/lib/LWP/UserAgent.pm line 216.

      Thinking about it, it actually makes sense to modify the header in the "request_prepare" phase. Since, while I'm modifying the header I'm still in the "prepare" phase.

      So other than using "request_prepare" to solve my problem, I think there is rationale behind using it over "request_send"

      According to the lwp documentation, the signature of @_ is the same, header, useragent, and the handler. "sub { my($request, $ua, $h) = @_; ... }"

      I'm not sure what you're trying to show me. You get the same error I do. Why does dumping a variable cause it to cause an error? In calling "print Dumper @_" where am I calling request?

      Add to that I change handlers without changing code and dumping @_ doesn't generate an error. According to the LWP docs the @_ has the same signature.

        ...

        request_send => sub { my($request, $ua, $h) = @_; ... }

        This handler gets a chance of handling requests before they're sent to the protocol handlers. It should return an HTTP::Response object if it wishes to terminate the processing; otherwise it should return nothing.

        The response_header and response_data handlers will not be invoked for this response, but the response_done will be.