尝试使用localhost在AJAX中查询图层时遇到了一些问题。这是代码:
var visitAPI = "http://mhclivemap.appsolutrends.net/api/visits?" +
"start=" + startDate.value + "&end=" + endDate.value +
"&diagnosis=" + mhc_type_select.options[mhc_type_select.selectedIndex].value;
var heatmapData = [];
$.ajax({
url: visitAPI,
dataType: "json",
crossDomain:true,
success: function (res) {
var result = res.visits;
var marker;
for (var i=0; i < result.length; i++) { // iterate thru each element in array
for (var j=0; j < result[i].count; j++) { // repeat for count in element
marker = new google.maps.LatLng(result[i].lat,result[i].lon);
heatmapData.push(marker);
}
};
},
error: function () {
alert('unable to load this layer, please try again later');
}
});
从这部分代码中,它返回一条错误消息:
XMLHttpRequest无法加载mhclivemap.appsolutrends.net/api/visits?start=2014-03-15&end=2014-04-15&diagnosis=GRP1。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许Origin localhost访问。
我想知道是什么导致了这个问题?是因为localhost吗?如果是这样,解决方案是什么?
提前致谢。
答案 0 :(得分:0)
您发送请求的服务器必须在响应中返回正确的CORS标头,例如Access-Control-Allow-Origin,其值为通配符或等于您发出请求的域。显然,这不会发生在这里。您需要确保服务器支持CORS。如果是,您需要确保您的域名已注册。
答案 1 :(得分:0)
XHR绑定到Same-Origin Policy。请求只能对生活在同一域中的资源进行。浏览器将阻止对外部域的请求。在您的情况下,您的操作为localhost
,请求为mhclivemap.appsolutrends.net
。两者都在不同的域上,浏览器会阻止它。
要从其他域请求,必须在外部域上配置Cross-Origin Resource Sharing。这是通过让它发送Access-Control-Allow-Origin
标题来完成的。如果没有此配置,外部服务器将不允许您从中获取数据。
有关如何为不同服务器配置CORS,请参阅http://enable-cors.org/。
答案 2 :(得分:0)
这是Xhr跨域访问问题。 Same origin policy是一种浏览器安全模型,用于防止跨域Xhr调用。 (由http:// abc.com创建的Xhr无法向http:// sub.abc.com发出请求)
如果无法控制远程服务器,服务器代理可能是解决此跨源访问问题的正确方法。这是一个简单的服务器代理示例(PHP):
Proxy.php (应该与进行API调用的页面位于同一个原点)
<?php
$url = $_GET['remoteUrl'];
$ch = curl_init();
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => "Google Bot",
CURLOPT_FOLLOWLOCATION => true
];
curl_setopt_array($ch, $options);
$output = curl_exec($ch);
curl_close($ch);
header("Content-Type: application/json;charset: UTF-8");
echo $output;
?>
<强> client.html 强>
var visitAPI = "http://mhclivemap.appsolutrends.net/api/visits?" +
"start=" + startDate.value + "&end=" + endDate.value +
"&diagnosis=" + mhc_type_select.options[mhc_type_select.selectedIndex].value;
$.ajax({
url: "proxy.php?remoteUrl="+visitAPI,
dataType: "json",
success: function(response){
console.log(response);
}
});
如果您可以控制远程服务器响应,请尝试使用JSONP方法。
<强> RemoteServer.php 强>
if(isset($_GET['callback'])){
//set response content-type header in application/javascript
header("Content-Type: application/javascript");
//wrap response with a function call, if client try to fetch cross-origin data in jsonp way
echo $_GET['callback']."(".$response.")";
}else{
header("Content-Type: application/json");
echo $response;
}
<强> client.html 强>
var visitAPI = "http://mhclivemap.appsolutrends.net/api/visits?" +
"start=" + startDate.value + "&end=" + endDate.value +
"&diagnosis=" + mhc_type_select.options[mhc_type_select.selectedIndex].value;
$.ajax({
url: visitAPI,
dataType:"jsonp",
success: function(response){
console.log(response);
},
error: function(response){
}
});
这个API也采用相同的策略来确定它应该返回什么类型的响应。