我在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);}
});