in reply to Re^2: POST array of hashes CGI
in thread POST array of hashes CGI

Mmmm, but if I just make my server script as simple as:

my $q = CGI->new(); my $json = $q->param('data'); print Dumper $json;

I get as result $VAR1 = undef; which sounds strange to me. Am I missing something?

Replies are listed 'Best First'.
Re^4: POST array of hashes CGI
by haukex (Archbishop) on Nov 26, 2018 at 17:36 UTC

    You need to set a Content-Type header, and use the special CGI.pm parameter name POSTDATA to access the body of the POST request. This works for me:

    Server:

    #!/usr/bin/perl -T use warnings; use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use Data::Dumper qw(Dumper); use JSON::MaybeXS qw/decode_json/; my $q = CGI->new(); print $q->header; my $data = $q->param('POSTDATA'); $data = decode_json($data) if $data; print Dumper($data);

    Client:

    #!/usr/bin/perl use warnings; use strict; use LWP; use HTTP::Request::Common; use JSON::MaybeXS qw/encode_json/; my @AoH = ( { husband => "barney", wife => "betty", son => "bamm bamm" }, { husband => "george", wife => "jane", son => "elroy" }, { husband => "homer", wife => "marge", son => "bart" } ); my $data = { data => \@AoH }; my $url = 'http://myurl.com/cgi-bin/memo.pl'; my $ua = LWP::UserAgent->new; my $request = POST($url, Content_Type=>'application/json', Content => encode_json($data) ); my $response = $ua->request($request); print $response->content, "\n";

    Output on client:

    $VAR1 = { 'data' => [ { 'son' => 'bamm bamm', 'husband' => 'barney', 'wife' => 'betty' }, { 'son' => 'elroy', 'wife' => 'jane', 'husband' => 'george' }, { 'husband' => 'homer', 'wife' => 'marge', 'son' => 'bart' } ] };

      Perfect. Learnt a lot again here! Thank you.