【问题标题】:Why do I get a Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource为什么我会阻止跨域请求:同源策略不允许读取远程资源
【发布时间】:2014-12-01 16:40:47
【问题描述】:

好的,所以我正在使用 API,目前我正在使用 geonames api。我的问题是它工作正常,直到...

让我解释一下,当我这样写代码时

$(document).ready(function() {


        Date.prototype.dateToString = function() {
               var yyyy = this.getFullYear().toString();
               var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
               var dd  = this.getDate().toString();
               return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); // padding
        };

        var d = new Date();
        var date = d.dateToString();


        $.ajax({
            dataType: "json",
            url: url
        }).then(function(data){

            var latitude = data.geonames[0].lat;
            var longitude = data.geonames[0].lng;

            var north = parseFloat(latitude) + 1;
            var south = parseFloat(latitude) - 1;
            var east = parseFloat(longitude) + 1;
            var west = parseFloat(longitude) - 1;

            var uri = encodeURI("http://api.geonames.org/earthquakesJSON?north=" + north + "&south=" + south + "&east=" + east + "&west=" + west + "&date=" + date +"&username=demo"); 

            $.ajax({
                dataType: "json",
                url: uri
            }).then(function(eData){

                var myLatlng = new google.maps.LatLng(parseFloat(data.geonames[0].lat), parseFloat(data.geonames[0].lng));

                function initialize() {

                    var mapProp = {
                        center : myLatlng,
                        minzoom: 1,
                        maxzoom: 20,
                        zoom : 7,
                        mapTypeId : google.maps.MapTypeId.ROADMAP
                    };

                    var map = new google.maps.Map(document.getElementById("googleMap"),
                        mapProp);

                    var marker = new google.maps.Marker({
                        position: myLatlng,
                        map: map,
                        title: 'Search Location\nLatitude: ' + data.geonames[0].lat + '\nLongitude: ' + data.geonames[0].lng  
                    }); 

                    for(item = 0; item < eData.earthquakes.length; item++){

                        if (eData.earthquakes.length > 0){
                            var eLat = eData.earthquakes[item].lat, eLng = eData.earthquakes[item].lng;
                        } else {
                            var eLat = '', eLng = '';
                        }
                        new google.maps.Marker({
                            position: new google.maps.LatLng(eLat,eLng),
                            map: map,
                            title: 'Date and Time: '+eData.earthquakes[item].datetime+'\nMagnitude: '+eData.earthquakes[item].magnitude+'\nDepth: '+eData.earthquakes[item].depth+'\nLat: '+eData.earthquakes[item].lat+'\nLong: '+eData.earthquakes[item].lng 
                        });
                    }
                }
                initialize();

                });
            });
        });

它可以正常工作,在页面按预期出现时加载,但是如果我将它包装在这样的函数中

 function getSearch(url){
    $(document).ready(function() {


        Date.prototype.dateToString = function() {
               var yyyy = this.getFullYear().toString();
               var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
               var dd  = this.getDate().toString();
               return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]); // padding
        };

        var d = new Date();
        var date = d.dateToString();


        $.ajax({
            dataType: "json",
            url: url
        }).then(function(data){

            var latitude = data.geonames[0].lat;
            var longitude = data.geonames[0].lng;

            var north = parseFloat(latitude) + 1;
            var south = parseFloat(latitude) - 1;
            var east = parseFloat(longitude) + 1;
            var west = parseFloat(longitude) - 1;

            var uri = encodeURI("http://api.geonames.org/earthquakesJSON?north=" + north + "&south=" + south + "&east=" + east + "&west=" + west + "&date=" + date +"&username=demo"); 

            $.ajax({
                dataType: "json",
                url: uri
            }).then(function(eData){

                var myLatlng = new google.maps.LatLng(parseFloat(data.geonames[0].lat), parseFloat(data.geonames[0].lng));

                function initialize() {

                    var mapProp = {
                        center : myLatlng,
                        minzoom: 1,
                        maxzoom: 20,
                        zoom : 7,
                        mapTypeId : google.maps.MapTypeId.ROADMAP
                    };

                    var map = new google.maps.Map(document.getElementById("googleMap"),
                        mapProp);

                    var marker = new google.maps.Marker({
                        position: myLatlng,
                        map: map,
                        title: 'Search Location\nLatitude: ' + data.geonames[0].lat + '\nLongitude: ' + data.geonames[0].lng  
                    }); 

                    for(item = 0; item < eData.earthquakes.length; item++){

                        if (eData.earthquakes.length > 0){
                            var eLat = eData.earthquakes[item].lat, eLng = eData.earthquakes[item].lng;
                        } else {
                            var eLat = '', eLng = '';
                        }
                        new google.maps.Marker({
                            position: new google.maps.LatLng(eLat,eLng),
                            map: map,
                            title: 'Date and Time: '+eData.earthquakes[item].datetime+'\nMagnitude: '+eData.earthquakes[item].magnitude+'\nDepth: '+eData.earthquakes[item].depth+'\nLat: '+eData.earthquakes[item].lat+'\nLong: '+eData.earthquakes[item].lng 
                        });
                    }
                }
                initialize();

                });
            });
        });
}

我收到此错误....

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote 
resource at http://api.geonames.org/searchJSON?q=Fukushima&maxRows=10&username=demo. 
This can be fixed by moving the resource to the same domain or enabling CORS.

我没有做足够的服务器端或使用 API 来确切知道这意味着什么,或者为什么它发生的唯一时间是我试图从表单中调用此方法。

编辑:::

在键入此内容时,我意识到不是函数中的包装在执行此操作,而是在提交表单时更改了 URL,因此在错误中提到了域,我应该放慢速度读得好一点。但是,由于我是在 javascript 和 ajax 中执行此操作的,所以我想知道,因为我知道可以在不调用服务器的情况下完成表单处理,我将如何去做。

我明白如果没有人给出直接的答案,我实际上更喜欢没有人直接回答,而是向我指出使用 javascript 和 ajax 处理客户端表单的文档方向,并简要说明或使用它的历史。

谢谢大家!

【问题讨论】:

    标签: javascript jquery ajax webforms form-submit


    【解决方案1】:

    CORS(跨域资源共享)规定,从浏览器发出的 AJAX 请求只能联系同一个主机。这意味着在 disney.com 上运行的 JavaScript 只能向其他 disney.com 端点发出 AJAX 请求。

    您的问题是您正在向 api.geonames.org 发送请求,即使您可能在自己的主机上运行,​​而不是在 api.geonames.org 站点上运行。

    服务器可以启用 CORS,这意味着它们将接受来自其他域的请求。但是,每个服务器都不同,大多数 API 仍然不允许跨域请求。看起来 api.geonames.org 是不支持 CORS 的其中之一。

    请注意,CORS 仅适用于从浏览器发送的请求。从后端服务器(如 Node 或 Rails)访问该 API 就可以了。

    【讨论】:

    • 谢谢,我真的很感激
    猜你喜欢
    • 2021-04-04
    • 2014-10-17
    • 2015-07-22
    • 2018-04-20
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多