2011-03-25 51 views
3

我正在使用一个API(这是我制作的,如果需要可以更改),它会吐出一些JSON(使用PHP的json_encode,因此它是有效的)。我在另一个域上的另一个网站上使用它来检索数据。无法让jQuery从另一个域获取JSON(使用JSONP)

不幸的是,我似乎无法得到它的工作。根据我从Chrome开发人员工具中可以看出的结果进行请求并获取数据(结果已从API下载)。似乎没有进一步的处理。

请求的URL看起来像这样(更换与实际查询 '查询',在这种情况下,乐队的名字):

http://gatekrash.com/api/v1?t=search&s=national&p=0&n=15&q=QUERY&callback=? 

Link to results page with query being 'Noah and the Whale'

结果是这样的(有效的JSON):

[{"id":"4123","title":"Noah And The Whale","type":null,"start":"2011-03-30 19:30:00","end":"2011-03-31 00:30:00","venue":{"id":"154","name":"The Deaf Institute"},"place":{"id":"17374","name":"Manchester"},"source_count":"1","performers":""},{"id":"9317","title":"Noah And The Whale","type":null,"start":"2011-05-04 19:00:00","end":"2011-05-05 00:00:00","venue":{"id":"539","name":"Leeds Metropolitan University"},"place":{"id":"15473","name":"Leeds"},"source_count":"1","performers":""}] 

jQuery的我使用来获取这个数据是这样的:

$(document).ready(function(){ 
    getSearch("Noah and the Whale"); 
}); 
$(document).ready((function(query) { 
getSearch = function(query) { 
    url = "http://gatekrash.com/api/v1?t=search&s=national&p=0&n=15&q=" + query + "&callback=?"; 
    $.getJSON(url, 
     function(json) { 
      alert("Success!"); 
     } 
    ); 
} 
})()); 

据我所知,这应该工作。我在API所属的站点上使用基本相同的代码(减去回调=?)来检索没有问题的数据,所以我认为这可能是一个跨域的事情。

该解决方案可能绝对是一件非常明显,简单的事情,在我的脸上,但我没有取得任何成功。

任何想法?

回答

2

你需要一个回调跨域JSONP工作。

'P'代表'Padded';即用函数调用。为了避开跨域策略,对于每个JSONP请求,jQuery在DOM中创建一个脚本标记,并将请求的URL作为源。 JSON被加载到脚本标记中,然后执行,就像任何其他脚本一样。问题在于执行一个对象并没有做太多的事情,相反,一个函数调用被包裹在它的周围,以便该对象作为参数传递给该回调函数。

JSON:(通常加载文本直接成JavaScript使用XMLHttpRequest的等)

{ "really":"simple", "example":"object" } 

JSONP:(通常装载到脚本标签,以避免跨域策略)

nameOfCallback({ "really":"simple", "example":"object" }) 

的后者会在JSONP加载时调用方法'nameOfCallback',传递该对象作为唯一参数。

对于未来的谷歌地图,这this answer可能会提供更多的帮助。

相关问题