2012-01-05 103 views
0

讓我解釋一下爲什麼我需要這樣做!是否可以通過POST使用javascript多次發送一個變量?

我需要請求發送到另一臺服務器,它的格式是這樣的:

http://www.test.ccom/process?item=1AAA&item=2BBB&item=3CCC

此URL將新增3個不同的項目(每一個)的結果頁面,如下所示:

Item = 1AAA Count=1 
Item = 2BBB Count=1 
Item = 3CCC Count=1 

如果我想補充一點,3只是一個項目,我應該用這樣的:

http://www.test.ccom/process?item=1AAA&item=1AAA&item=1AAA

而結果頁面將是這樣的:

Item = 1AAA Count=3 

我的問題是我不能使用GET方法(因爲我們要添加100個項目超過發送我的請求,它會導致「請求-URI太大「錯誤)

我使用兩種不同的方法通過POST發送此請求,但沒有成功。

首先,我用這個功能:

function post_by_form(path, params) { 

    // The rest of this code assumes you are not using a library. 
    // It can be made less wordy if you use one. 
    var form = document.createElement("form"); 
    form.setAttribute("method", "post"); 
    form.setAttribute("action", path); 
    form.setAttribute("style", "display: none") 

    for(var key in params) { 
     var hiddenField = document.createElement("input"); 
     hiddenField.setAttribute("type", "hidden"); 
     hiddenField.setAttribute("name", "item"); 
     hiddenField.setAttribute("value", params[key]); 

     form.appendChild(hiddenField); 
    } 

    document.body.appendChild(form); 
    form.submit(); 
} 

它的工作原理,當我用不同的變量名稱(NAME =「項」 +鍵)進行測試,但是當我使用一個變量名,這是行不通的所有的投入。

然後我用這個功能通過AJAX發送POST請求:

function post_by_ajax(path, params_arr){ 
    var http = new XMLHttpRequest(); 
    var url = path; 

    var params = ""; 
    for(var key in params_arr) { 
     if (params != "") 
      params += "&item="+params_arr[key]; 
     else 
      params += "item="+params_arr[key]; 
    } 

    http.open("POST", url, true); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.setRequestHeader("Content-length", params.length); 
    http.setRequestHeader("Connection", "close"); 

    http.onreadystatechange = function() {//Call a function when the state changes. 
     if(http.readyState == 4 && http.status == 200) { 
      alert(http.responseText); 
     } 
    } 
    http.send(params); 
} 

同樣的結果,無論這個方法會返回只有一個數量只是一個項目(最後一個)......雖然我們可以提交一個帶有很多輸入字段的表單,並且都使用相同的名稱,爲什麼我不能用這些方法來完成它?我在邏輯上有什麼問題嗎?!有人能幫幫我嗎?!

+0

'$ .post(url,{},function(response){});' - 爲什麼不呢? – devdRew 2012-01-05 21:15:25

+0

@devdRew:發送是可能的,讓它在服務器端是棘手的! ;) – Monica 2012-01-05 22:30:54

回答

1

使用Firefox與TamperData插件,而只是有四個字段都指定爲<input type="text" name="item">我可以看到POST數據確實發送變量都命名爲「項目」但每個不同值的形式。

然後由接收服務器來做一些合理的事情。大多數系統只會使用一個發送的四個值(可能是第一個,也可能是最後一個),但如果已經有一個服務器正確處理了http://www.test.ccom/process?item=1AAA&item=1AAA&item=1AAA,那麼您添加的多個字段都應該是「item」。

如果情況並非如此,那麼您需要編寫一些東西來處理服務器上的問題 - 無法使用JavaScript編碼。這將涉及到獲取整個POST主體並自己處理它,因爲大多數服務器端框架(如我所說)通常只使用其中一個值。

您可以使用TamperData或類似的東西來捕獲HTTP數據流,並查看您現在使用的JavaScript實際傳輸的內容。


因此,最終,你的問題的答案是「可以通過POST使用JavaScript多次發送一個變量嗎?」是是的,這是可能的。

+0

感謝您的明確回覆...讓我測試一下,我會回到你的答案,謝謝你的時間 – Monica 2012-01-05 21:58:21

+0

你是對的,我在我的測試環境中使用php,它只是告訴我最後一個變量,與CheckBox字段同名的同名字!對於複選框,我們應該使用括號,以便將它們轉換爲數組......無論如何,我再次用真實服務器測試過我的帖子,它只是向我顯示一個錯誤頁面,所以它似乎也無法解析這些變量!但它適用於獲取請求!它如何與Get一起工作,但無法使用Post?這有點奇怪...... – Monica 2012-01-05 22:16:20

+1

'如何使用Get但不能使用Post?!'這取決於如何編寫服務器代碼。我主要在Java中工作,並且可以編寫單獨的GET和POST處理程序,所以我可以在GET中支持,但不支持POST。對於GET,我可以得到參數,在這種情況下,它只會給我一個'item'的值,或者我可以得到整個查詢字符串並自己解析它,使其按照您的描述工作。同樣,對於POST,我可以獲取參數並只獲取一個值,或者我可以獲取整個POST主體並自行處理。這取決於服務器端代碼的作者。 – 2012-01-06 00:27:57

1

如果您傳遞所有具有相同名稱的變量,例如:'item',那麼請求處理程序無法區分它們。這就是爲什麼你只能獲得1個元素。嘗試將元素重命名爲item1 =值& item2 =值& item3 =值。

如果你傳遞100個元素,那麼你一定要使用post方法。名稱問題將存在於發佈和獲取中,因此請確保所有項目的命名均不相同。

+0

你是對的,但問題是,如果我添加任何變量的名稱,服務器不能得到它們(服務器應用程序不是我的,所以我不能改變它) – Monica 2012-01-05 21:48:17

+0

服務器應用程序將需要即使您打算傳遞所有具有相同名稱的變量,也必須對其進行修改才能接受此更改。再次,我仍然建議使用不同的變量名稱來幫助調試和測試。 – evasilchenko 2012-01-05 21:52:45

+0

我完全同意你的想法,不幸的是我不是他們的老闆! :P – Monica 2012-01-05 22:17:31

相關問題