我正在尝试将XMLHttpRequest对象发送到我的Rails服务器,但是标头导致我的函数停止。以下是我的观察:
当我注释掉设置标题的3行代码时,xhr.readyState最终将等于4(匿名函数中的警告框将关闭)。
如果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);
}
我的三个问题是:
为了通过POST方法发送数据,我需要在上面的代码中进行哪些更改?
我的印象是POST方法需要发送一些标题,但我不清楚哪些标题虽然是“xhr.setRequestHeader('Content-type','application / x-www-form-了urlencoded');”似乎是参考文献中经常提到的一个。有人可以帮我理解a)为什么需要发送标题和b)需要发送哪些标题?
我正在使用rails服务器并在本地开发。最终,此代码将在移动设备的客户端执行,该移动设备将转到托管的rails服务器以传递和接收数据。使用带有rails服务器的POST方法有限制吗?请记住,我计划在从服务器向客户端发送信息时使用JSON。
谢谢!
更新:标题应该在打开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个小时。
答案 0 :(得分:1)
带有JavaScript代码的网页是否也存在于localhost:3000上?如果不是,则将其视为跨域请求,并且您的服务器将需要返回特殊标头。所以你有两个选择:
1)在与服务器相同的域上托管网页,这将使其成为同域请求。
2)让您的服务器返回相应的CORS标头。您可以在此处了解有关CORS的更多信息:http://www.html5rocks.com/en/tutorials/cors/