Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

post JSON using HTTP::Tiny - cannot parse URL

by GertMT (Friar)
on Apr 23, 2020 at 15:56 UTC ( #11115954=perlquestion: print w/replies, xml ) Need Help??

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

hello all,

trying to post some JSON while using HTTP::Tiny. To my idea I have an okay structure of the data to post and I'm also authorised to post however I get the message 'content' => 'Cannot parse URL: \'HASH(0x7fc154e1fb50)\'.

The full code and result I see from data::Dumper is pasted below. Maybe someone can tell me what I'm doing wrong?

Best,
Gert
sub create_external_inv { my $headers = { Accept => "application/json", 'Content-Type' => "application/json", Authorization => "Bearer 123" }; my $url = "https://moneybird.com/api/v2/123/external_sales_invoice +s"; my $data = ( { external_sales_invoices => { "reference" => "M-8426", "date" => "2020-03-14", "contact_id" => 456, "details_attributes" => [ { "description" => "coffee", "price" => 2.25, "tax_rate_id" => 891 } ] } } ); my $agent = HTTP::Tiny->new; my $res = $agent->post( { url => $url, content => $data, headers => $heade +rs } ); print Dumper $res; if ( $res->{success} ) { print "Okay!\n"; } else { print "\n\Nope...\n\n"; } }

The result I see in the log from my Dancer2 app

'content' => 'Cannot parse URL: \'HASH(0x7fc154e1fb50)\' ', 'url' => { 'content' => { 'external_sales_invoices' => { 'reference' => 'M-8426', 'details_attributes' => [{'tax_rate_id' => '891, 'description' => 'coffee', 'price' => '2.25}], 'date' => '2020-03-14', 'contact_id' => '456 } }, 'headers' => { 'Content-Type' => 'application/json', 'Accept' => 'application/json', 'Authorization' => 'Bearer 123' }, 'url' => 'https://moneybird.com/api/v2/123/external_sales_i +nvoices' }, 'reason' => 'Internal Exception', 'success' => '', 'status' => 599, 'headers' => { 'content-type' => 'text/plain', 'content-length' => 41 } };

Replies are listed 'Best First'.
Re: post JSON using HTTP::Tiny - cannot parse URL
by choroba (Archbishop) on Apr 23, 2020 at 16:01 UTC
    Are you sure about the arguments of post?
    $agent->post( { url => $url, content => $data, headers => $headers } ) +;

    The tests show something different.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
      Thank you for the reference and I promise to look at the tests more often. Very helpful.

      I didn't get it to work yet and will post later when I've solved it.

        alright with the following code I got it to work.
        Thanks!
        sub create_external_inv { my $agent = HTTP::Tiny->new; my $headers = { Accept => "application/json", 'Content-Type' => "application/json", Authorization => "Bearer 123" }; my $url = "https://moneybird.com/api/v2/123/external_sales_invoices"; my $data = { external_sales_invoice => { "reference" => "M-8426", "date" => "2020-03-14", "contact_id" => 456, "details_attributes" => [ { "description" => "coffee", "price" => 2.25, "tax_rate_id" => 891, } ] } }; my $res = $agent->post( $url => { content => to_json($data), headers => $headers } ); print Dumper $res; if ( $res->{success} ) { print "Okay!\n"; } else { print "\n\nNope...\n\n"; } }
        The results print okay!.
Re: post JSON using HTTP::Tiny - cannot parse URL
by 1nickt (Abbot) on Apr 23, 2020 at 20:23 UTC

    Hi,

    • The URL is not a named argument for HTTP::Tiny request methods. It's the first positional argument.
    • Passing a Perl data structure as the content of the POST request won't work. You need to serialize it.

    Try this with your real auth token:

    $ perl -Mstrict -MJSON -MData::Dumper -MHTTP::Tiny -E'my $resp = HTTP: +:Tiny->new->post("https://moneybird.com/api/v2/123/external_sales_inv +oices", { headers => {Accept => "application/json", "Content-Type" => + "application/json", Authorization => "Bearer 123"}, content => to_js +on({ external_sales_invoices => { "reference" => "M-8426", "date" => +"2020-03-14", "contact_id" => 456, "details_attributes" => [ { "descr +iption" => "coffee", "price" => 2.25, "tax_rate_id" => 891 } ] } })}) +; say Dumper $resp->{content}'
    (I get the following:)
    $VAR1 = '{"error":"access token invalid","symbolic":{"request":"invali +d_grant"}}';

    Hope this helps!


    The way forward always starts with a minimal test.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (3)
As of 2021-09-18 18:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?