API Opensky 网络无法访问数据

API Opensky Network impossible to access data

OpenSky-Network 是一个 API 用于全球飞机定位数据的网络。与 Openlayers-3 一起玩真是太棒了……但是! (因为有但是!)

使用 JavaScript,我试图访问 this URL

中 JSON 数据的一些变量

我真的被屏蔽了。它可以通过 Firefox 中的简单导航访问,而不是 JavaScript.

它看起来真的很愚蠢,因为它与其他 API 一起工作,例如 this one,或其他像 Wikipedia、Wikidata、Openlayers-3 的 Nominatim。

我真的在问自己为什么这不适用于 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 文档的限制部分,我无需注册即可完成。

Anonymous are those users who access the API without using credentials. The limitations for anonymous users are:

  • Anonymous users can only get the most recent state vectors, i.e. the time parameter will be ignored.

  • Anonymous users can only retrieve data with a time resultion of 10 seconds. That means, the API will return state vectors for time now−(now mod 10)

因此,我有几个问题:

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

  2. 为什么这个 URL 有问题?

  3. 仅针对此 url 的“同源”政策有什么问题?

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

It seems really stupid because its working with other APIs like this one, or other one like Wikipedia, Wikidata, Nominatim for Openlayers-3.

  1. What is the problem with "Same Origin" policy just for this url?

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

  1. Why is this specific URL having issues?

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

Can I access the variables at the URL of the API of OpenSky-Network with JavaScript?

最近 GitHub 上有一个类似的 issue。跨源请求将不会很快可用。您必须使用您的网络服务器代理 API 请求。

如果您以后在使用我们的服务时遇到任何困难,我建议您将问题发布到 OpenSky Forum。我只是偶然发现了这个线程。论坛中的问题将通知所有 OpenSky 管理员,并使我们能够尽快回复。

我是 OpenSky 开发人员之一。

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