我在服务器上设置了以下标题
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
response.addHeader("Access-Control-Allow-Headers","X-Custom-Header");
我想使用POST方法访问Web服务并向其发送数据,但问题是我设置服务器导致问题
我使用了以下方法
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// XHR for Chrome/Safari/Firefox.
xhr.open(method, url, true);
}
else if (typeof XDomainRequest != "undefined") {
// XDomainRequest for IE.
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// CORS not supported.
xhr = null;
}
return xhr;
}
并基于此对象
url = "http://myurl.do";
var xhr = createCORSRequest('POST', url);
if (!xhr) {
alert('CORS not supported');
return;
}
var params = "name=pari123&action=initaction&gameId=slotreel3";
xhr.setRequestHeader('Content-Type', 'application/text/plain');
if(xhr.readyState == 4 && xhr.status == 200)
{
alert('Tested OK')
xhr.send(params);
}
else
{
alert('status not 200 or xhr is not ready');
}
// Response handlers.
xhr.onload = function() {
var text = xhr.responseText;
alert('Response from CORS request to ' + url + ': ' + text);
};
xhr.onerror = function() {
alert('Woops, there was an error making the request.');
};
但是它总是警告一条消息,说'状态不是200或xhr还没准备好',如果你知道请帮助,我无法继续任何一个!
当我打印xhr.readyState
时,打印的值为1
答案 0 :(得分:2)
if(xhr.readyState == 4 && xhr.status == 200)
此检查必须放在onreadystatechange
事件处理程序中。在实际发送之前,你显然不能拥有200状态代码或“已完成”的请求。
你想要的可能就是:
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
alert('Tested OK');
var text = xhr.responseText;
alert('Response from CORS request to ' + url + ': ' + text);
}
};
xhr.send(params);
如果您希望else
案例检查错误,请记住您仍然需要检查xhr.readyState == 4
。您不希望您的错误处理代码为其他readyStates运行。
不需要onload
事件 - 当您readyState == 4
知道请求已完成时。
答案 1 :(得分:2)
这里可能有几个问题。
我发现不同的浏览器以不同的方式实现CORS。我的经验基于Firefox和谷歌浏览器。例如,我必须在服务器端添加一个特殊的标题,以便Firefox可以使用一个连接进行预检(OPTIONS)请求和实际请求(GET,PUT等),就像谷歌Chrome一样。您必须在服务器端添加:
response.addHeader("Keep-Alive", "timeout=2, max=100");
response.addHeader("Connection", "Keep-Alive");
我还注意到有些浏览器不喜欢CORS标头中的通配符(“*”)。该行的解决方法
response.addHeader("Access-Control-Allow-Origin", "*");
将返回请求的来源而不是通配符。
然而,可能还有其他问题,我们需要更多细节。例如,当服务器托管在同一域上时,请求是否有效(即问题可能与CORS无关)。你在用什么服务器?
答案 2 :(得分:0)
xhr.send();
需要在调用xhr.open();
之后才这样做吗?状态1表示请求尚未发送,除非您实际发送请求,否则它永远不会进入状态4。