Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跨源请求被阻止:多个API;需要聚合数据_Javascript_Jquery_Ajax_Json_Weather Api - Fatal编程技术网

Javascript 跨源请求被阻止:多个API;需要聚合数据

Javascript 跨源请求被阻止:多个API;需要聚合数据,javascript,jquery,ajax,json,weather-api,Javascript,Jquery,Ajax,Json,Weather Api,目标:从至少3个API获得几天的精密度。 主要问题:跨源请求被阻止,导致数据未定义。什么是跨源请求?如何解决干扰If()语句并将收集到的JSON数据收集到聚合中以获得平均精度的问题? 更新的解决方案: //Get the back dated times and current in UNIX, //later make a lookup that gives datediff from current date and user's date and adjust index

目标:从至少3个API获得几天的精密度。 主要问题:跨源请求被阻止,导致数据未定义。什么是跨源请求?如何解决干扰If()语句并将收集到的JSON数据收集到聚合中以获得平均精度的问题? 更新的解决方案:

    //Get the back dated times and current in UNIX, 
   //later make a lookup that gives datediff from current date and user's date and adjust index i condition to equal exact days.
            var totalPrecipSinceDate;
            var threeDayAPITimes = [];

        for (var i = 0; i <= 2; i++) //place user userData-1 where i <= input
    {
        var myDate = new Date(); //http://stackoverflow.com/questions/7693170/javascript-convert-from-epoch-string-to-date-object
        var epoch = myDate.getTime(); 
        var unixEpoch = Math.round(epoch/1000)
        threeDayAPITimes[i] = Math.round(unixEpoch - (86400 * i));

    }
    //Plan to convert UNIX dates to display

    //List of locations: LATITUDE,LONGITUDE
    var locations = ["46.3494,-85.5083"]

    //setup a server-side proxy which would hide the API key from the client side
    var currentAPIKey ="privateKey"; //gets an APIkey from user input.



var listAPIs = "";

$.each(threeDayAPITimes, function(i, time) {
    var darkForecastAPI= "https://api.forecast.io/forecast/" + currentAPIKey + "/" + locations + "," + time +"?callback=?"; 
     $.getJSON(darkForecastAPI, {
        tags: "WxAPI[" + i + "]",  //Is this tag the name of each JSON page? I tried to index it incase this is how to refer to the JSON formatted code from the APIs.
        tagmode: "any",
        format: "json"
    }, function(result) {
        // Process the result object    
        var eachPrecipSum = 0;
    if(result.currently.precipIntensity >=0 && result.currently.precipType == "rain")
        {
            $.each(result, function() {
              eachPrecipSum += (this.currently.precipIntensity);
              totalPrecipSinceDate += eachPrecipSum ;  ///Write mean precip
                        alert(eachPrecipSum );
        });

    }   
});
});
//在UNIX中获取过期的时间和当前时间,
//稍后进行查找,给出当前日期和用户日期的datediff,并将索引i条件调整为相等的精确天数。
var总沉淀日期;
var threeDayAPITimes=[];

对于(var i=0;i您正试图调用由域api.forecast.io提供服务的URL,该URL不同于您的javascript代码源于的域,因此它是一个跨域请求

其他域不支持CORS。这可以通过其他域添加ACAO头来解决


您可以在服务器端代码中调用Ajax,而不必处理CORS,而不用在客户端JavaScript中调用Ajax。Google:CORS proxy{您的服务器端语言}

跨源请求是指您向另一个域发出请求。为保护用户,默认情况下不允许这样做。浏览器使用同一源策略。这意味着您只能在同一域上发出请求

您无法解决跨源请求问题。forecast.Io的所有者必须使用HTTP头授权您的域。我猜他们不会这么做。基本上CORS让源代码控制谁可以使用API,而不是消费者

您最好的选择可能是绕过限制。您将需要使用JSONP。他们支持这一点,但请注意以下非常明智的注意事项: 以JSONP形式返回API响应。使用此方法时请小心,因为向公众公开API密钥是一种安全隐患,如果滥用,将导致重新登录API密钥。但是,如果开发个人或内部使用的应用程序,这是一种方便的方法

要启用JSONP,只需将?callback=?作为URL的查询字符串。这将使jQuery设置JSONP。在您的示例中,您可以在构建URL的任何位置执行此操作,因此:

var darkForecastAPI= "https://api.forecast.io/forecast/" + currentAPIKey + "/" + locations + "," + time +"?callback=?";
但是,正如他们提到的,您的API密钥是公开的,所以要小心。如果可能的话,在您的服务器上创建一个服务器端web服务,作为JavaScript和API之间的代理。不确定这是否可能,但在他们的网站上,他们提供了一个用PHP编写的web服务,您可以很容易地用任何语言编写


我还要介绍一下JSONP的一些背景知识,因为这可能是您第一次听说它。这是有风险的。与返回对象的JSON不同,JSONP实际上调用JS函数并直接执行代码。这意味着如果有恶意站点,它可能会造成破坏。我不会太担心forecast.Io,但如果是这样的话meshadyrussianmp3site我会小心的!它的工作方式是在你的页面中注入一个
标记。脚本标记没有相同的来源限制。该文件基本上将一个JSON对象包装到对jquery_12345的调用中,jquery为你抽象了该对象,因此它的工作方式与正常工作方式一样。除了安全性之外,还有另一个缺点,就是没有好的方法来删除tect failure.JQuery可以通过超时来“假设”失败,这会有所帮助,但不会出现500个错误或类似于使用true JSON时出现的任何错误。

这里不需要任何花哨的东西,因为请求可以在不到10行的纯旧Javascript中完成。单击下面的“运行代码片段”进行测试

另一种选择是使用Yahoo,它每天将返回1000个预测,无需API密钥。更多详细信息如下:


函数回调(数据){
//对预测数据做些什么
document.getElementById('stdout')。innerHTML=JSON.stringify(数据,null,'\t');
}
var head=document.head | | document.getElementsByTagName('head')[0]| | document.documentElement;
var script=document.createElement('script');
script.type='text/javascript';
script.src=https://api.forecast.io/forecast/c52dea83654f200f77cf97db47fdd03e/46.3494,-85.5083?回调=回调'
head.appendChild(脚本);

不熟悉ACAO标题,请详细解释您对该解决方案的想法。@safron6这不是一个解决方案,因为必须在forecast.Io端添加ACAO标题,而不是您的。他们不会这样做。请参阅下面的我的回答,它可能会为您指出正确的方向。如果您还有其他问题,我很乐意回答帮助。我在发布之前更改了API键。为了设置一个更好的示例,我在变量中替换了privateAPIKey字符串。这条语句具体在哪里?callback=?进入代码?或者至少指向要添加它的行,我不确定。确定,
var darkForecastAPI=”https://api.forecast.io/forecast/“+currentAPIKey+”/“+位置+“,”+时间+“?回调=?”?";
它是一个查询字符串参数。顺便说一句,API密钥的要点不是你会将其发布到stackoverflow上,它会成为公共的,因为我所要做的就是在你的网页上查看源代码,然后我就可以窃取它。然后我可能滥用你的API密钥并禁止你访问forecast.Io。这就是为什么他们建议你设置一个服务器端代理w这会对客户端隐藏API密钥。太好了,感谢您的帮助和智慧。跨源错误已经消失,但现在我遇到了一个小调试问题。在当前Wx的长JSON脚本中,如何使用&&语句要求这两个条件都为真,并且必须读为“rain”?我在firebug中得到了一个未定义的返回,但代码在C#类上下文(我更熟悉)中似乎有意义。您有权访问您的web服务器配置吗?如果有,修复非常简单。