POST data with XMLHttpRequest to CGI (Mozilla)

J

Jarson

My JavaScript is trying to POST data to a CGI script (Perl) using
XMLHttpRequest. My CGI server gets different data from IE than Mozilla
Firefox.

// For Mozilla, req = new XMLHttpRequest();
// For IE req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = requestHandler ; // function to handle async
response
req.open('POST', myURL, true); // use POST
req.send('foo=11&bar=22') ;

A Perl CGI script prints the parameters passed to it.
$q = new CGI ;
foreach my $param ($q->param) {
print "$param: " . $q->param($param) . "\n" ;
}

The data received by the CGI script is inconsistent, depending if the client
is IE or Mozilla (Firefox)
Server result from IE client:
foo: 11
bar: 22
Server result from Mozilla Firefox client:
POSTDATA: foo=11&bar=22

It seems that the POST data IE sends is more correct than the Mozilla data.
Is there another way to send the data in Mozilla so the CGI script will give
the same results. I could easily adjust the CGI script, but I think the
problem is at the client.

Jarson (jarson from sygration, that's a dot com company if you need to send
an email)
 
M

Martin Honnen

Jarson said:
My JavaScript is trying to POST data to a CGI script (Perl) using
XMLHttpRequest. My CGI server gets different data from IE than Mozilla
Firefox.

// For Mozilla, req = new XMLHttpRequest();
// For IE req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = requestHandler ; // function to handle async
response
req.open('POST', myURL, true); // use POST

First make the open call, then set the onreadystatechange handler and
then before you send the data set the HTTP request header e.g.
if (typeof req.setRequestHeader != 'undefined') {
req.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
}
req.send('foo=11&bar=22') ;

as that seems to be the content type of the data you want to post.
 
A

Andy Hassall

My JavaScript is trying to POST data to a CGI script (Perl) using
XMLHttpRequest. My CGI server gets different data from IE than Mozilla
Firefox.

// For Mozilla, req = new XMLHttpRequest();
// For IE req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = requestHandler ; // function to handle async
response
req.open('POST', myURL, true); // use POST
req.send('foo=11&bar=22') ;

A Perl CGI script prints the parameters passed to it.
$q = new CGI ;
foreach my $param ($q->param) {
print "$param: " . $q->param($param) . "\n" ;
}

The data received by the CGI script is inconsistent, depending if the client
is IE or Mozilla (Firefox)
Server result from IE client:
foo: 11
bar: 22
Server result from Mozilla Firefox client:
POSTDATA: foo=11&bar=22

It seems that the POST data IE sends is more correct than the Mozilla data.
Is there another way to send the data in Mozilla so the CGI script will give
the same results. I could easily adjust the CGI script, but I think the
problem is at the client.

Aren't you missing setting the content-type for your request, that is, using:

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

Perhaps one browser fills in the blanks whereas the other doesn't; either way
you ought to explicitly state it when POSTing data.
 
J

Jarson

MAGIC!! Adding setRequestHeader to my JavaScript fixed it!

setRequestHeader was missing from my code and all of the documentation and
samples I've read!
Unscientific research:

Google for +XMLHttpRequest +send = 65,500 results
Google for +XMLHttpRequest +setRequestHeader = 516 results

Thanks Martin and Andy for that piece of valuable information!
Jarson
 
T

Thomas 'PointedEars' Lahn

Martin said:
Jarson said:
My JavaScript is trying to POST data to a CGI script (Perl) using
XMLHttpRequest. My CGI server gets different data from IE than Mozilla
Firefox.

// For Mozilla, req = new XMLHttpRequest();
// For IE req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = requestHandler ; // function to handle
async response
req.open('POST', myURL, true); // use POST

First make the open call, then set the onreadystatechange handler [...]

Does not make sense to me. Why?


PointedEars
 
L

Lasse Reichstein Nielsen

Thomas 'PointedEars' Lahn said:
Martin Honnen wrote:
[XMLHttpRequest]
First make the open call, then set the onreadystatechange handler [...]

Does not make sense to me. Why?

Why it doesn't make sense to you? Who knows :)

Anyway: The "open" call doesn't make the connection, it merely sets up
the request-object. The actual connection is created when the "send"
method is called, and the ready-state will not change until this
point. That means that it's safe to assign the handler after the call
to "open".

Some browsers will not honor event handlers set before the "open"
call, as if that call completely initializes the object.

/L
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top