1

我在 jQuery 中使用以下 API 调用来检索数据。我在?callback=?最后附加了似乎解决了跨域域问题,如果我不包括我得到跨域错误。

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

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

我可以通过在 Chrome ConsoleResources中查看响应来查看响应。但是如何在 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/

4

3 回答 3

1

除非您可以控制api.visistat.com并修改stats-api-v2.php脚本,否则除了联系服务并要求他们修复他们发送的响应头(它需要Content-Type: text/json,而 PHP 默认是text/html)之外,您无能为力。在浏览器方面,您收到的警告发生在 Javascript 有机会处理数据之前 - jQuery<script>以您的 API URL 作为其源来实例化一个元素,并且浏览器在收到响应时立即注意到内容类型不匹配,之前将其传递回 jQuery。

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

于 2012-08-28T10:43:51.443 回答
0

像这样使用 $.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);}
})​;​
于 2012-08-28T10:46:59.807 回答
0

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

这意味着您的回复应包含:

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

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

如果您无法访问/更改 api 来解决此问题,则无法使用 jsonP。

你说的是CORS。这是一个不同的故事......你只需要确保它发送正确的标题。

http://enable-cors.org/

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

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

于 2012-08-28T10:51:11.437 回答