【发布时间】:2015-05-05 16:11:44
【问题描述】:
我正在尝试访问a public web service provided by USGS。根据网页,他们支持CORS,甚至还提供了JQuery 的示例(值得一提的是该示例没有设置标题),但我尝试了一切,但到目前为止没有运气。 stackoverflow 上有很多关于 cross-domain ajax 和 CORS 的帖子,但到目前为止没有任何帮助。
我尝试了普通的XMLHttpRequest 和JQuery,有和没有各种标题,没有任何效果。普通的返回 status 代码 0,我认为这表明请求在某处被阻止。
有人对javascript CORS 有过成功的经验,无论是普通的还是使用jquery 的?
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
function callWebService() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
alert(xmlhttp.responseText);
} else {
alert(xmlhttp.status);
}
}
};
xmlhttp.open("GET", "http://waterservices.usgs.gov/nwis/iv/?format=json&sites=01646500¶meterCd=00060", true);
//xmlhttp.setRequestHeader("Accept","text/plain");
xmlhttp.setRequestHeader("Access-Control-Allow-Headers", "x-requested-with, x-requested-by, Content-Type");
xmlhttp.setRequestHeader("Access-Control-Allow-Origin", "*");
xmlhttp.setRequestHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
xmlhttp.setRequestHeader("Access-Control-Max-Age", "604800");
xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xmlhttp.send();
}
function callWebServiceWithJQuery() {
$(document).ajaxError(
function (event, jqXHR, ajaxSettings, thrownError) {
alert('[event:' + objToString(event) + '], [jqXHR:' + objToString(jqXHR) + '], [ajaxSettings:' + objToString(ajaxSettings) + '], [thrownError:' + objToString(thrownError) + '])');
});
$.ajax({
/*beforeSend: function (request) {
request.setRequestHeader("Access-Control-Allow-Headers", "x-requested-with, x-requested-by, Content-Type");
request.setRequestHeader("Access-Control-Allow-Origin", "*");
request.setRequestHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
request.setRequestHeader("Access-Control-Max-Age", "604800");
},*/
url: "http://waterservices.usgs.gov/nwis/iv/?format=json&sites=01646500¶meterCd=00060",
dataType:'json',
data:'',
success: function(response) {
alert("succ");
alert(response);
},
error: function(a,b,c) {
alert("err");
alert(a);
alert(b);
alert(c);
}
});
}
</script>
</head>
<body>
<form>
<button onclick="callWebService();">Click me</button>
</form>
</body>
</html>
【问题讨论】:
-
您不必设置任何标题。服务器这样做。向我们提供来自包含这些标头的服务器的响应标头,以便我们确认您是否遵循所述服务器设置的 CORS 政策。
-
@KevinB,感谢您的回复,下面昆汀的回答解决了这个问题。显然,您对标题是正确的。对我来说,关键是 return false。再次感谢!
标签: javascript jquery ajax cross-domain cors