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

Update: Indeed, I stupidly forgot to include a Content-Type in the request headers, ++ to the helpful monks who replied. As well, I will take friedo's advice and look into the existing library mentioned.

Fair warning, this is not a strictly perl question, but rather also involves the javascript XMLHttpRequest class.

I'm sending a POST request from from a client-side page using javascript:

var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", "process.pl", true); xmlhttp.onreadystatechange=handleHttpResponse; xmlhttp.send("foo=bar");
However, in the target perl script, The CGI module can't seem to find the contents of the POST request:
$q = new CGI; print $q->header('text/plain'); print $q->param('foo'); # returns undef
If I send the request as a GET, it works just fine and appears in $ENV{QUERY_STRING} where CGI.pm expects it, but the data I will be sending is faaar too big for a GET request.

Does anyone have an idea what this problem is, or how to fix it? Thanks for taking the time to read this, I would really appreciate any help!

__________
Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.
- Terry Pratchett

Replies are listed 'Best First'.
Re: Perl's CGI.pm and Javascript's XMLHttpRequest
by friedo (Prior) on Dec 06, 2006 at 20:12 UTC

    Did you set a content-type header for your POST request? Try adding this before you call send():

    xmlhttp.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );

    Also, I strongly recommend checking out something like prototype.js -- it makes doing cross-platform AJAX requests much easier than dealing with XMLHTTPRequest directly.

      Straying a little more off topic...

      I'll second the recommendation of using something like prototype.js for this. Your xmlHTTPRequest will look like this:

      new Ajax.Request( '/url/to/post/to', { asynchronous: true, evalScripts: true, parameters: Form.serialize(this), onComplete: jsFunctionToCallBack });

      If you're using Catalyst (ah, back to perl!) there's even a handy Prototype plugin to make things a little easier.

      Recently, though, I've been turned onto jquery which is a little more lightweight than prototype, and much better documented. The above post would then look something like:

      $.ajax( { url: '/url/to/post/to', type: 'POST', dataType: 'html', data: $('form#form_id').formSerialize(), complete: jsFunctionToCallBack } );


      --chargrill
      s**lil*; $*=join'',sort split q**; s;.*;grr; &&s+(.(.)).+$2$1+; $; = qq-$_-;s,.*,ahc,;$,.=chop for split q,,,reverse;print for($,,$;,$*,$/)
Re: Perl's CGI.pm and Javascript's XMLHttpRequest
by Joost (Canon) on Dec 06, 2006 at 20:15 UTC