2013-03-07 106 views
0

我尝试使用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参数?

+2

JavaScript适合我。如果你打开chrome开发工具(推F12),然后运行你的javascript,chrome dev工具会报告正确发送的头文件(你可以在Network下查看XHR,然后点击请求并查看头文件) – dsas 2013-03-07 00:15:55

+0

工作过我也在FF19和Chrome25上。可能是在同一页面上的其他JS?或者也许删除这条线只是为了测试? req.setRequestHeader(“Connection”,“close”); – 2013-03-07 00:45:34

+0

谢谢dsas和Scott Yang。你的评论导致我走上了答案的道路。 看着网络 - 在Chromium开发人员工具上的XHR,我看到它发送一个POST,重新获得301“永久重定向”,然后重试它作为一个GET。我在我的Apache配置中发现它重定向非GET请求的目录不以斜线结尾。在网址的末尾添加斜杠解决了问题。由于我是一个没有声誉的新手,我无法回答我的问题8个小时,所以我只能留下评论。 – Dave 2013-03-07 01:05:28

回答

0

我刚刚复制你的代码,并试过它,它工作得很好。

+0

是的代码工作。谢谢。见上面的评论。问题在于URL不会以斜线结尾,所以Apache返回301并导致GET重试。在我的网址末尾添加斜线解决了问题。 – Dave 2013-03-07 02:02:39

+0

啊,好吧,你没有告诉我们的网址。 – 2013-03-07 14:00:56