API Opensky Network无法访问数据

时间:2017-01-24 14:37:39

标签: javascript json xmlhttprequest restful-url

OpenSky-Network是一种用于飞机定位全球数据的API。很高兴与Openlayers-3一起玩......但是! (因为有一个但是!)

使用JavaScript,我试图在this URL

访问JSON数据的一些变量

我真的被封锁了。可以通过Firefox中的简单导航访问它,而不是使用JavaScript。

这看起来真的很愚蠢,因为它与其他API合作,如this one,或其他类似维基百科,维基数据,Nominatim等Openlayers-3。

我真的在问自己为什么这不适用于OpenSky-Network。我唯一看到的是Firefox向我展示了一个跨域问题,但我确信有一个解决方案。

我尝试了很多技巧:

Tech1

$.getJSON( url , function(data) {
    console.log(data);
});

TECH2

$.ajax({
    url: url,
    type: 'GET',
    success: function(data) {
        console.info(data);
    }
});

Tech3车队

 $.ajax({
     url: url,
     dataType: 'jsonp', 
     crossDomain : true,
     success:function(xhr, json){               
         alert("Success ");
     },
     error:function(){
         alert("Error");
     }      
 });

Tech4

var xhr = null;
var response = null; 

if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); }
else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }

xhr.onreadystatechange = function() {
    console.info("state changed");

    if (xhr.readyState === 4) {

        if (xhr.status === 200) {
            response = xhr.responseText;
            console.info("response="+response);
        }
    }
    else {}
};

xhr.open("GET", url,true);
xhr.send(null);

使用所有这些和其他技术,我无法在opensky url api中获取JSON数据。我的意思是我想将它用作JavaScript变量,但我不能。

这真是令人沮丧,因为在检查器工具(Firefox中的F12键)中,我可以看到JSON对象和值。有一个“同源”政策问题,然后我没有变量。问题是什么?我真的无法理解这个“同源”政策概念,英语不是我的母语。

根据API文档的限制部分,我可以在不注册的情况下完成。

  

匿名是那些在不使用凭据的情况下访问API的用户。匿名用户的限制是:

     
      
  • 匿名用户只能获取最新的状态向量,即时间参数将被忽略。

  •   
  • 匿名用户只能检索时间结果为10秒的数据。这意味着,API将立即返回状态向量 - (现在为mod 10)

  •   

因此,我有几个问题:

  1. 我可以使用JavaScript访问OpenSky-Network API的URL中的变量吗?

  2. 为什么此特定网址存在问题?

  3. 此网址的“同源”政策有什么问题?

2 个答案:

答案 0 :(得分:2)

我是OpenSky开发人员之一。

正如codepearlex已经提到的,OpenSky API不允许使用CORS。我们最近启用了此功能,因此您现在应该可以在浏览器和任何域中访问API。

答案 1 :(得分:0)

如上所述,同源政策(SOP)就是问题所在。

  

这看起来真的很愚蠢,因为它与其他API合作,如this one,或其他类似维基百科,维基数据,Nominatim等Openlayers-3。

     
      
  1. 仅针对此网址的“同源”政策有什么问题?
  2.   

当服务器收到传入请求时,它可以检查请求标头中的Origin字段,并允许或禁止关于SOP的请求。请注意,“disallow”并不意味着服务器拒绝数据,而是不在响应头中设置Access-Control-Allow-Origin字段,从而导致浏览器阻止请求。为了让浏览器允许请求,响应标头中的Access-Control-Allow-Origin字段必须等于Origin字段或*。 您提供的API(http://ipinfo.io/213.32.89.142/json)会返回Access-Control-Allow-Origin: *,因此允许来自每个来源的请求。

  
      
  1. 为什么此特定网址存在问题?
  2.   

OpenSky API在响应标头中不包含Access-Control-Allow-Origin字段,这意味着您的浏览器会阻止请求并拒绝从服务器访问有效负载(如果发出请求的脚本是从其他来源加载的,你的服务器)。正如您在调试控制台中注意到的那样,数据存在,但您的浏览器会限制访问。

  

我可以使用JavaScript访问OpenSky-Network API的URL吗?

最近在GitHub上有类似的issue。交叉原始请求将很快无法提供。您必须使用您的网络服务器代理API请求。

如果您将来遇到任何有关我们服务的问题,我建议您将问题发布到OpenSky Forum。我偶然发现了这个帖子。论坛中的问题将通知所有OpenSky管理员,使我们能够尽快做出回应。