我尝试使用XMLHttpRequest一个新手。我研究了遍布互联网的大量例子。使用GET方法没有问题,但是当我尝试切换到POST时,它无法传输参数。 :(XMLHttpRequest的POST方法PHP服务器没有收到post数据,但得到精细
这里是我的精简例子复制的问题:
的Javascript:
function GetPostTest(url)
{
var req = null;
var postParms = 'p1=x&p2=y';
var getParms = '';
getParms = 'g1=a&g2=b';
if (getParms) url += '?'+getParms;
req = new XMLHttpRequest
if (req)
{
req.open('POST', url, true);
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-length", postParms.length);
req.setRequestHeader("Connection", "close");
req.onreadystatechange = function()
{
if (req.readyState == 4 && req.status == 200)
{
alert('Got Stuff Back: ' + req.responseText);
}
}
req.send(postParms);
}
}
服务器:
<?php
foreach ($_POST as $key=>$value) echo htmlspecialchars(' _POST['.$key.']=['.$value.']');
foreach ($_GET as $key=>$value) echo htmlspecialchars(' _GET['.$key.']=['.$value.']');
foreach ($_REQUEST as $key=>$value) echo htmlspecialchars(' _REQUEST['.$key.']=['.$value.']');
exit;
?>
在这个例子中,服务器只报告回所有的它接收到的GET和POST参数,然后显示在警告框中,我在那里也抛出了几个GET参数,我通过的参数是:
- GET:G1 =一个& G2 = B
- PUT:P1 = X & P2 = Y
警报对话框显示:“得到的东西返回:_GET [G1] = [一] _GET [g2] = [b] _REQUEST [g1] = [a] _REQUEST [g2] = [b]“。这告诉我,它发送到服务器没关系,回来没关系,只是POST变量没有通过。
我关掉getParms所以我只发送POST参数,然后我看不出有什么变数。我关闭了三个setRequestHeader()或我在示例代码中看到的其他变体的任何组合,并且它不会改变任何内容。
我使用Google Chromium版本24.0.1312.56 Ubuntu 11.10(24.0.1312.56-0ubuntu0.11.10.1)和Apache在Xubuntu 2.2.20-1ubuntu1.3上使用PHP进行测试。
感谢您的分析。如何解决这个问题以推送POST参数?
JavaScript适合我。如果你打开chrome开发工具(推F12),然后运行你的javascript,chrome dev工具会报告正确发送的头文件(你可以在Network下查看XHR,然后点击请求并查看头文件) – dsas 2013-03-07 00:15:55
工作过我也在FF19和Chrome25上。可能是在同一页面上的其他JS?或者也许删除这条线只是为了测试? req.setRequestHeader(“Connection”,“close”); – 2013-03-07 00:45:34
谢谢dsas和Scott Yang。你的评论导致我走上了答案的道路。 看着网络 - 在Chromium开发人员工具上的XHR,我看到它发送一个POST,重新获得301“永久重定向”,然后重试它作为一个GET。我在我的Apache配置中发现它重定向非GET请求的目录不以斜线结尾。在网址的末尾添加斜杠解决了问题。由于我是一个没有声誉的新手,我无法回答我的问题8个小时,所以我只能留下评论。 – Dave 2013-03-07 01:05:28