2013-03-07 50 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

相關問題