XMLHttpRequest无法加载,请求的资源上没有“Access-Control-Allow-Origin”标头

时间:2013-11-18 22:51:02

标签: javascript jquery xmlhttprequest

  

XMLHttpRequest无法加载http://maps.googleapis.com/maps/api/distancematrix/xml?origins=Affenhausen&destinations=Achenkirch&mode=driving&language=de-DE&sensor=false。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。

Javascript代码为

function distanceCalc(){
    start_location = $('select.start option:selected').val();
    target_location = $('select.end option:selected').val();
    $.get('http://maps.googleapis.com/maps/api/distancematrix/xml?origins='+start_location+'&destinations='+target_location+'&mode=driving&language=de-DE&sensor=false', function(data) {

DreamWeaver工作正常,但是当我通过浏览器打开它时,我得到了同样的错误。

4 个答案:

答案 0 :(得分:10)

这有点棘手,即使你正确设置了CORS,它仍然会失败。您应该使用Google的内置函数来访问它。如果您尝试通过$ .get()或类似方法直接访问它,它将失败...请查看此示例: https://developers.google.com/maps/documentation/javascript/examples/distance-matrix

有趣的事实,当通过$ .get()访问时(虽然我不确定为什么):

-THIS WORKS: http://maps.googleapis.com/maps/api/geocode/

-THIS FAILS: http://maps.googleapis.com/maps/api/distancematrix/

我的建议 - 不要尝试通过get()获取json / xml。在函数中使用google的API构建来发送请求,然后正确解析响应

此示例代码可以帮助您入门:

// var origins      = [];
// var destinations = [];

var distanceMatrix  = new google.maps.DistanceMatrixService();
var distanceRequest = { origins: origins, destinations: destinations, travelMode: google.maps.TravelMode.DRIVING, unitSystem: google.maps.UnitSystem.METRIC, avoidHighways: false, avoidTolls: false };
distanceMatrix.getDistanceMatrix(distanceRequest, function(response, status) {
    if (status != google.maps.DistanceMatrixStatus.OK) {
        alert('Error was: ' + status);
    }
    else {
        var origins      = response.originAddresses;
        var destinations = response.destinationAddresses;
        // rest of your code here...
    }
}

答案 1 :(得分:9)

听起来你有一个跨域问题,因为响应中没有'Access-Control-Allow-Origin'标头。如果不是这种情况,浏览器通常不允许请求位于另一个域上的服务而不是触发请求的javascript。

看起来像你正在使用的api不适合这种方法,也许这可以帮助: How to make cross-domain AJAX calls to Google Maps API?

答案 2 :(得分:-1)

您似乎正在尝试从您的域中访问其他域。它是一个跨域问题,对于这种跨域访问,不允许使用json调用或服务器端调用。

答案 3 :(得分:-1)

如果您正在使用像我这样的angularjs请求应该是这样的

NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text attributes:@{NSFontAttributeName:[UIFont fontWithName:@"BurbankSmall-Medium" size:16]}];