2012-08-28 20 views
1

我在jQuery中使用以下API调用来检索数据。我在末尾追加了?callback=?,似乎解决了跨域问题,如果我不包括我得到跨域错误。如何从使用Ajax的visistat.com API交叉获取JSON或JSONP结果?

在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/

+0

该API链接不适用于我。我认为它有一些cookie用于验证您是否可以看到它。但请尝试使用[YQL](http://developer.yahoo.com/yql)作为代理 - 它可以读取JSON并返回JSONP或CORS。 – hippietrail

+0

对不起,直接链接到该网页不起作用,看到它去到网站,然后点击“现场演示”,然后“statcaster API”。 感谢YQL的建议我认为我在这里取得了一些进展goo.gl/6k5Tg – user1629974

+0

我没有找到任何文档的API。 'd'参数需要什么值除了'JSON'?我尝试过'XML'或者只是把它抛出去,但得到各种错误。 YQL的一个怪癖是,虽然它可以输入和输出JSON,但内部一切都是XML,格式之间的转换可能会使它们变得有点“怪异”。也许你可以使用'd'参数通过YQL获得更直接的数据格式。 – hippietrail

回答

1

除非你有超过api.visistat.com控制,并可以修改stats-api-v2.php剧本,没有什么可以做,除了联系业务,并要求他们修复了头,他们发送响应(它需要Content-Type: text/json,而PHP默认为text/html)。在浏览器端,你得到警告发生的Javascript有任何机会与数据工作之前 - jQuery的实例化一个<script>元素与您的API URL作为其源,并在收到响应时,浏览器立刻注意到的内容类型不匹配,然后再传递给jQuery。

这个警告是无害的,但。真正的问题是,您使用的服务不支持JSONP - 您提供了在jQuery文档中指定的callback参数来强制JSONP结果期望值,但该服务实际上并不生成有效的JSONP(它仍然会生成纯JSON)。我试着在你的API请求改变d=jsond=jsonp,但显然它不是由服务支持。您需要找出一种方法从服务中获取JSONP结果,或者在您的域上实现服务器端代理,以避免跨域问题。

+0

这是有道理的,虽然我不明白为什么它不可能通过浏览器接收数据的一些工作来处理text/html响应。 如果我实现的东西服务器端不会我仍然有同样的问题试图操纵返回的文本/ HTML数据与JavaScript?我想这个想法是首先解析它是jsonp。 到api页面的链接是http://www.visistat.com/tracking/api-manager.php – user1629974

+0

如果您无法访问更改api,则服务器端代理是唯一选项。在这种情况下,你可以发送任何你想要的响应标题... – VDP

+0

谢谢,我会尝试使用节点。 – user1629974

0

使用$就这样

$.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);} 
})​;​ 
+1

由于跨域限制而无法使用。似乎没有办法仅使用Javascript使用该API。 – Dmitry

+0

嘿我更新答案使crossdomain为真 – Ashirvad

+1

仍然没有解决问题。服务器需要发送正确的标题。 (Access-Control-Allow-Origin)'$ .getJson'对于'$ .ajax'来说只是一些简单的配置,但是做了同样的事情。 – VDP

0

如果使用callback参数告诉jQuery的使用JSONP

这意味着你的回答应与被包装:

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

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

如果您不能访问/修改API来解决这个问题,你不能使用JSONP。

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

http://enable-cors.org/

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

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

+0

感谢您的回答,我想我需要进一步了解如何使用代理。我以text/html格式获取数据,所以认为必须有某种方式来操纵它,但听起来像是不可能的。 – user1629974

+0

文本/ html是你的问题最少:)而且你可以修改它们在你的代理无论如何。 – VDP

+1

好的,谢谢我打算使用节点来解决这个问题。 – user1629974

相关问题