如何使用Ajax从visistat.com API交叉获取JSON或JSONP结果



我在jQuery中使用以下API调用来检索数据。我在末尾添加了?callback=?,这似乎绕过了跨域问题,如果不包括,我会得到跨域错误。

在chrome中,它说:"资源被解释为脚本,但使用MIME类型text/html传输。"

返回的响应为Content-Type: text/html; charset=UTF-8

我可以在Chrome控制台中查看响应→资源。但是我如何在JavaScript中操作响应呢?

$.getJSON("http://api.visistat.com/stats-api-v2.php?key=skx79q0pyu01.&qt=idd&d=json&sdate=2012-08-26&edate=2012-08-28?callback=?", function(json) {
    console.log(json);
});

我没有更改API的权限。

更新:尝试使用YQL解决问题,例如。http://jsfiddle.net/4VEHR/5/

看起来这个插件可能也很有用:https://github.com/padolsey/jQuery-Plugins/tree/master/cross-domain-ajax/

除非您可以控制api.visistat.com并可以修改stats-api-v2.php脚本,否则除了联系服务并要求他们修复随响应发送的标头(它需要Content-Type: text/json,而PHP默认值为text/html)之外,您别无选择。在浏览器端,在Javascript有机会使用数据之前,就会出现警告-jQuery实例化了一个以API URL为源的<script>元素,当收到响应时,浏览器会立即注意到内容类型不匹配,然后再将其传递回jQuery。

不过,这个警告是无害的。真正的问题是,您使用的服务不支持JSONP——您提供了jQuery文档中指定的callback参数来强制JSONP结果预期,但该服务实际上并没有生成有效的JSONP(它仍然生成纯JSON)。我已经尝试在您的API请求中将d=json更改为d=jsonp,但显然该服务不支持它。您需要想办法从服务中获得JSONP结果,或者在域上实现服务器端代理,以避免跨域问题。

如果使用callback参数,则会告诉jquery使用jsonP

这意味着你的回复应该包含:

callback( ...your data...);

JSONP意味着它创建了一个方法callback(可以获取数据)。Than添加了一个带有src属性的scripttag你的url。脚本加载执行的回调方法。你有数据。

如果你不能访问/更改api来修复这个问题,你就不能使用jsonP。

你说CORS。那是另一回事。。。你只需要确保它发送的标题是正确的。

http://enable-cors.org/

基本上确保它发送Access-Control-Allow-Origin: your domain(或*允许所有)

如果你不能做到这一点,你唯一的选择就是代理。代理是一种中间件。您向脚本发出请求,脚本获取数据并将其返回给您。例如php代理。您可以在asp、jsp、flash甚至javaapplet中做同样的事情。

像这样使用$.ajax

$.ajax({
    url:"http://api.visistat.com/stats-api-v2.php?key=skx79q0pyu01.&qt=idd&d=json&sdate=2012-08-26&edate=2012-08-28",
    dataType:'jsonp',
    crossDomain:true,
    success:function(data){alert(data);}
})​;​

相关内容

  • 没有找到相关文章

最新更新