2016-03-09 33 views
1

senderform的方法是POST時,一切正常。但是,只要將方法更改爲GET,我就不會在服務器上收到任何內容。如何使用GET方法通過XMLHttpRequest傳遞FormData

function ajaxSubmit(destinationElement, senderform) { 

    var xmlreq = new XMLHttpRequest(); 
    var params = new FormData(senderform); 
    xmlreq.open(senderform.method, senderform.action, true); 

    if (/\/content\.php$/.test(senderform.action)) 
     xmlreq.onreadystatechange = receiveTable; 
    else xmlreq.onreadystatechange = receiveText; 

    xmlreq.send(params); 
} 

我知道我可以在manually append key-value pairs行動地址的末端,但問題是,我不知道哪種形式會與哪些領域進行傳遞。

如果可能的話,我更喜歡原生的javaScript。

如何使用XMLHttpRequest和senderform中的指向表單元素的鍵值對發送GET請求(與POST請求已工作的方式相同)?

+0

問題是什麼? – whipdancer

+0

如何使用XMLHttpRequest發送來自'senderform'的鍵值對(它指向表單元素)(與對POST請求已有效的方式相同)發送GET請求? –

+0

GET!= POST。他們是完全不同的機制。您不能像使用POST一樣使用GET。要使用GET代替POST,您需要解析表單,收集名稱:值對,將它們添加到查詢字符串中 - 就像您提供的鏈接一樣。 – whipdancer

回答

1

你確定這個問題不是PHP腳本嗎?我發現沒有參考https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#send()與FormData需要開機自檢,但如果PHP腳本從$ POST或某事(我的PHP生鏽)的信息,行爲將是不同的。

+0

我建議你在瀏覽器調試模式下看看網絡選項卡,看看實際傳輸的是什麼 –

0

由於您無法在GET請求中創建可用的正文(請參見下文),因此另一個選項是在url中使用params。

function buildGetUrlParams(baseUrl, paramsObj) { 
 
    var builtUrl = baseUrl + "?"; 
 
    Object.keys(paramsObj).forEach(function(key) { 
 
    builtUrl += key + "=" + paramsObj[key] + "&"; 
 
    }); 
 
    return builtUrl.substr(0, builtUrl.length - 1); 
 
} 
 

 
document.getElementById('finalUrl').innerText = buildGetUrlParams('http://test.url.com', { name:'James', occupation:'web design' });
<div id="finalUrl"></div>

HTTP GET請求可以包含體,但沒有語義該機構。簡而言之,這意味着服務器沒有任何理由去處理GET請求的主體,也沒有任何有關如何處理的知識。如果它是可以編寫能做到這一點的服務器,這將是不好的做法,因爲按照HTTP/1.1規格:

如果請求方法不包括語義定義爲一個實體主體,那麼消息的機構應在處理請求時被忽略。

而這基本上是爲什麼它不工作。如果您想發送服務器能夠響應的任何類型的數據,那麼您需要使用不同的HTTP方法。

This answer也解釋了這個問題。

+0

感謝您的回答,它很好地解釋了爲什麼我的解決方案不起作用。然而,它沒有調整引用的表單。我已經發布瞭解決方案的答案。 –

1

最後我提出了這個解決方案,該解決方案從senderform窗體引用加載所有鍵值對。

function ajaxSubmit(destinationElement, senderform) { 
var xmlreq = new XMLHttpRequest(); 
var params = new FormData(senderform); 

if (senderform.method == 'get') 
{ 
    var firstRun = true; 
    for (var key of params.keys()) 
    { 
     if (firstRun) 
     { 
      senderform.action += '?'; 
      firstRun = false; 
     } 
     else senderform.action += '&'; 
     senderform.action += key + "=" + params.get(key); 
    } 
} 
xmlreq.open(senderform.method, senderform.action, true); 
if (senderform.action.indexOf('content.php')!==-1) 
    xmlreq.onreadystatechange = receiveTable; 
else xmlreq.onreadystatechange = receiveText; 
xmlreq.send(params); 
} 

結合@ tanc的回答和this article我能解決我的問題。

相關問題