2012-01-26 44 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