XMLHttpRequest Post方法 - 标头正在停止功能

时间:2012-01-26 09:33:24

标签: ruby-on-rails json post xmlhttprequest

我正在尝试将XMLHttpRequest对象发送到我的Rails服务器,但是标头导致我的函数停止。以下是我的观察:

  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);
    }
    
  3. 我的三个问题是:

    1. 为了通过POST方法发送数据,我需要在上面的代码中进行哪些更改?

    2. 我的印象是POST方法需要发送一些标题,但我不清楚哪些标题虽然是“xhr.setRequestHeader('Content-type','application / x-www-form-了urlencoded');”似乎是参考文献中经常提到的一个。有人可以帮我理解a)为什么需要发送标题和b)需要发送哪些标题?

    3. 我正在使用rails服务器并在本地开发。最终,此代码将在移动设备的客户端执行,该移动设备将转到托管的rails服务器以传递和接收数据。使用带有rails服务器的POST方法有限制吗?请记住,我计划在从服务器向客户端发送信息时使用JSON。

    4. 谢谢!

      更新:标题应该在打开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 个答案:

答案 0 :(得分:1)

带有JavaScript代码的网页是否也存在于localhost:3000上?如果不是,则将其视为跨域请求,并且您的服务器将需要返回特殊标头。所以你有两个选择:

1)在与服务器相同的域上托管网页,这将使其成为同域请求。

2)让您的服务器返回相应的CORS标头。您可以在此处了解有关CORS的更多信息:http://www.html5rocks.com/en/tutorials/cors/