2012-01-26 77 views
0

我想發送一個XMLHttpRequest對象到我的Rails服務器,但標題導致我的函數停止。這裏是我的意見:XMLHttpRequest Post方法 - 標題停止功能

  1. 當我註釋掉3行代碼設置的標頭,然後xhr.readyState最終將等於4(警告框匿名函數關火內)。

  2. 如果3個標題行中的任何一行未註釋,則xhr對象永不改變狀態(警報框中沒有任何一個會觸發)。

    function saveUserProfile(){ 
    
        var user_email = $('#userEmail_box').val();   
        var xhr = new XMLHttpRequest(); 
    
        xhr.onreadystatechange=function(){ 
        if (xhr.readyState==4 && xhr.status==200) 
        { 
         alert("Yes: " + xhr.readyState); 
        } 
        alert("No: " + xhr.readyState);  
        } 
    
        var method = 'POST'; 
        var params = 'userEmail=user_email'; 
        var url = 'http://localhost:3000/xhr_requests.json'; 
        var async = true; 
    
        //Need to send proper header information with POST request 
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
        xhr.setRequestHeader('Content-length', params.length); 
        xhr.setRequestHeader('Connection', 'close'); 
    
        xhr.open(method, url, async); 
        xhr.send(params); 
    } 
    

我的三個問題是:

  1. 我需要什麼,在代碼中更改上面以便通過POST方法發送的數據?

  2. 我的印象是,POST方法需要發送一些頭文件,但我不清楚哪些是「xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded 「);」似乎是參考文獻中經常提到的一個。有人可以幫助我理解a)爲什麼需要發送標題和b)需要發送哪些標題?

  3. 我正在使用rails服務器,並且正在本地進行開發。最終,這些代碼將在移動設備的客戶端執行,該設備將轉到託管軌道服務器以傳遞和接收數據。在rails服務器上使用POST方法有什麼限制嗎?請記住,我計劃在從服務器向客戶端發送信息時使用JSON。

謝謝!

UPDATE:標頭應該來開盤後的XHR請求但在此之前它發送:

xhr.open(method, url, async);   

    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
    xhr.setRequestHeader('Content-length', params.length); 
    xhr.setRequestHeader('Connection', 'close'); 

    xhr.send(params); 

希望這篇文章可以節省別人4小時。

回答

1

您的帶有JavaScript代碼的網頁是否也存在於localhost:3000上?如果沒有,這被認爲是一個跨域請求,你的服務器將需要返回特殊的頭文件。因此,您有兩種選擇:

1)將網頁託管在與服務器相同的域上,這將使其成爲同域請求。

2)讓你的服務器返回適當的CORS頭文件。您可以在這裏瞭解更多關於CORS的信息:http://www.html5rocks.com/en/tutorials/cors/

+0

我發現了這個錯誤:需要在打開xhr請求後但在發送之前設置標頭。你可以參考這篇文章,http://stackoverflow.com/questions/6207339/xmlhttprequest-setrequestheader-error – Vee