Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^3: Consuming A Web Service

by NetWallah (Canon)
on Nov 02, 2016 at 21:38 UTC ( [id://1175181]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Consuming A Web Service
in thread Consuming A Web Service

The modification should not have been necessary. The two are equivalent.

The "=>" operator auto-quotes the argument to its left, so the single-quotes I used are not strictly necessary, but it is a matter of style, and they should work fine.

Let me know what error you got when the quotes were in place.

        ...it is unhealthy to remain near things that are in the process of blowing up.     man page for WARP, by Larry Wall

Replies are listed 'Best First'.
Re^4: Consuming A Web Service
by pkupnorth (Novice) on Nov 03, 2016 at 15:17 UTC

    NetWallah, here is the code with your suggestion as listed:

    use strict; use warnings; use LWP::UserAgent; use HTTP::Request::Common qw(GET); my $ua = LWP::UserAgent->new; my $endpoint = 'Http://www.somecompany.com:8081/api/ourCompany/getASN +'; my $req = HTTP::Request->new('GET', 'Accept' => 'application/xml'); $req->url($endpoint); my $resp = $ua->request($req); my $message = $resp->content; print "printing message: $message\n\n";

    I get the error message "bad header argument at code.pl line 8." Which is the HTTP::Request->new line.


    Here is the working code with the slight modifications:

    use strict; use warnings; use LWP::UserAgent; use HTTP::Request::Common qw(GET); use XML::Simple; my $ua = LWP::UserAgent->new; my $endpoint = 'Http://www.somecompany.com:8081/api/ourCompany/getASN +'; my $req = HTTP::Request->new(GET => $endpoint); $req->header(Accept => 'application/xml'); $req->url($endpoint); my $resp = $ua->request($req); my $message = $resp->content; print "printing message: $message\n\n";

    Thanks,
    pkupnorth

      pkupnorth, you changed 3 things:

      • Changed from 'GET' to GET => $endpoint
      • Moved the 'Accept' to a separate $req->header() line
      • Changed from 'Accept' => ... to Accept => ...

      If you do them one at a time, you will find that it was moving the Accept from the ->new(...) to a separate $req->header() line that got rid of the "Bad header argument at code.pl line 8." error, not the removal of the single quotes.

      use strict; use warnings; use LWP::UserAgent; use HTTP::Request::Common qw(GET); my $ua = LWP::UserAgent->new; my $endpoint = 'Http://www.sierraaluminum.com:8081/api/MarvinWindows/ +getASN'; my $req = HTTP::Request->new('GET'); $req->header('Accept' => 'application/xml'); $req->url($endpoint); my $resp = $ua->request($req); my $message = $resp->content; print "printing message: $message\n\n";

      update: fixed the order of the quoted version in the bullet list

      update 2: added "not the removal of the single quotes"; removed an unnecessary sentence that was unnecessarily argumentative in tone.

      Thanks, pryrt for the analysis.

      The syntax for HTTP::Request's "new" method requires arguments in pairs, so my previous suggestion was wrong.

      It should have been:

      my $req = HTTP::Request->new(GET => $endpoint, Accept => 'application/xml');
      The "Accept" and "GET" can optionally be quoted.

              ...it is unhealthy to remain near things that are in the process of blowing up.     man page for WARP, by Larry Wall

        I had tried my $req = HTTP::Request->new(GET => $endpoint, Accept => 'application/xml'); using the OP's server, but I still got the "Bad header argument" error. When I switched to using the separate $req->header, then it started working.

        Looking at HTTP::Request (quoted below), I originally read it the same way as you, that new() required pairs, and was surprised the code above would still give the error. But on a re-read (underline added):

        Constructs a new HTTP::Request object describing a request on the object $uri using method $method. The $method argument must be a string. The $uri argument can be either a string, or a reference to a URI object. The optional $header argument should be a reference to an HTTP::Headers object or a plain array reference of key/value pairs. The optional $content argument should be a string of bytes.

        The $header should either be an object or an arrayref. The $content is the content of the request, not of the header. Running the OP code with the headers with your changes, but in an arrayref, eliminates the error: my $req = HTTP::Request->new(GET => $endpoint, [Accept => 'application/xml']);

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1175181]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (3)
As of 2024-04-26 07:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found