jquery – d3.json,d3.xhr和跨域问题

前端之家收集整理的这篇文章主要介绍了jquery – d3.json,d3.xhr和跨域问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天我做了几个测试,我们可以用d3加载json文件,因为我对这个问题很感兴趣: d3.json works but $.getJson fails.但是我做的一些测试有点棘手.
d3.xhr("http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*+where+%7B%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FRoger_Federer%3E+%3Fp+%3Fo+filter%28lang%28%3Fo%29+%3D+%27en%27%29%7D%0D%0A&debug=on&timeout=&format=application%2Fsparql-results%2Bjson&save=display&fname=",function(data)
console.log("success1"); 
alert(data);
});

d3.json("http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*+where+%7B%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FRoger_Federer%3E+%3Fp+%3Fo+filter%28lang%28%3Fo%29+%3D+%27en%27%29%7D%0D%0A&debug=on&timeout=&format=application%2Fsparql-results%2Bjson&save=display&fname=",function(data){              console.log("success2");
alert(data);
});


d3.xhr("http://api.worldbank.org/countries/BRA/indicators/BX.KLT.DINV.CD.WD?per_page=10&date=2007:2012&format=json",function(data){
console.log("success3");
alert(data);
})

d3.json("http://api.worldbank.org/countries/BRA/indicators/BX.KLT.DINV.CD.WD?per_page=10&date=2007:2012&format=json",function(data){
console.log("success4");
alert(data);
})

我知道这个问题可能与至少两个原因有关:MIME类型和CORS,但是我不能理解其他几件事情:

>如果回调始终执行(甚至有时候,OK 200也可能是从jQuery的.ajax()和.getJSON()方法中看到的错误)为什么只能看到一个数据(第一个) ) – 其余的情况总是错误
> d3.xhr方法支持的MIME类型是什么?
>如果d3.json只是d3.xhr的一个很好的包装器,为什么示例1工作,示例2不工作?我想澄清一点.我主要使用d3与我的服务器的文件,但有些情况下,我也必须使用一些外部数据,这也是真的很好,这也是D3,而不仅仅是与jQuery.

我认为应该有这些方法接受的所有MIME类型的列表.

解决方法

第二个失败的第一个请求成功的原因与dbpedia.org服务器的配置有关. d3.json()函数有两件事情:

>它将Accept标头设置为mimetype application / json
>它使用JSON.parse()解析响应

Number 1是问题 – dbpedia.org服务器正在为Accept:application / json标头返回406(Unacceptable)的响应.我不知道为什么这是真的,但是给出你发送的URL参数,看起来服务器期望应用程序/ sparql-results json,而是指定d3.xhr()成功的mime类型,而使用application / json失败.

使用世界银行的数据,请求失败,因为服务器不是CORS-enabled.只有在浏览器中进行远程API调用而不启用CORS的方法是使用JSONP(假设API支持它).就像它发生的那样,data.worldbank.com does support JSONP,但D3没有 – 你需要自己处理它,或者使用像jQuery这样的第三方库提出请求.

一般而言,D3并没有将jQuery和其他库所支持的AJAX的强大AJAX优先考虑在内,因为这不是它的重点 – 所以如果你想加载各种各样的外部资源,你应该可以使用第三方库这有更多的支持仔细调整的AJAX调用.根据您要加载的内容,另一个选项是在您自己的服务器上设置一个可以调用远程API的代理,然后通过本地HTTP调用将数据返回到可视化 – 在这种情况下,所有D3的加载程序应该工作正常

猜你在找的jQuery相关文章