如何从外部JSON提要创建JSONP?

时间:2011-01-11 22:02:52

标签: javascript jquery cross-domain

我有两个域:www.domain1.com和www.domain2.com

我在domain1上有一个简单的JSON提要。

我想从domain1中提取JSON提要并将其放在domain2上的模块上。

从我读过的内容来看,实现它的方法是使用JSONP,但是你如何去做呢?有没有办法只用JQuery / javascript做到这一点?或者我是否必须使用服务器端代码(我正在使用Coldfusion)。我也可以使用.getJSON而不是.ajax(我是初学者,所以我从来没用过.ajax)

修改 好吧,我仍然感到困惑。只是在网址末尾添加回调就打破了它。我怎么能做到这一点,而不是一个远程路径的饲料我拉这个代码在www.domain2.com上的绝对路径但是Feed是在www.domain1.com上?

var feed ="/event/json.tag/tag/sports/";

$.getJSON(feed,function(data) {

   $.each(data.items, function(i,obj) {

       do something here...
   }        

}

3 个答案:

答案 0 :(得分:1)

JSONP只是一个围绕JSON对象的回调函数。 一般约定是有一个返回JSON的端点,除非在请求上定义了一个回调参数,并在这种情况下返回JSONP。

即。 http://www.domain1.com/api/getStuff可能会返回:

{'foo': 'bar', 'fizz': 'buzz'}

然后http://www.domain1.com/api/getStuff?cb=cb123应该返回:

cb123({'foo': 'bar', 'fizz': 'buzz'});

我不知道ColdFusion,但我认为这个例子很好:http://www.coldfusionjedi.com/index.cfm/2009/3/11/Writing-a-JSONP-service-in-ColdFusion

除非其他人已经在您正在使用的服务器中构建了JSONP支持,否则没有仅限客户端的解决方案......

答案 1 :(得分:0)

阅读jQuery文档$.ajax$.getJSON将是一个良好的开端,无论如何有很多关于jsonp的好教程,this例如,一个很棒的教程:

$.getJSON("http://api.oscar.aol.com/presence/get?k=key&f=json&t=aimuser&c=?",
   function(result){
      if (result.response.data.users[0].state == 'online') {
       $("#status").css("background-image", "url('online.jpg')");
      }
   }
);

如网站所述:

  

f参数告诉服务什么   格式返回结果 - JSON   在我们的例子中。 c参数指定   要使用的JSON回调 - 这是   重要!

在jQuery文档中:

  

如果URL包含字符串   “回调=?” (或类似的,如定义的   由服务器端API),请求   被视为JSONP。

因此,请记住发送回调并处理后面的数据很容易。

编辑:另一个好example

EDIT2:
当没有指定回调值时,jQuery将为您(从$ .getJSON页面)分配flickr URL:

  

http://api.flickr.com/services/feeds/photos_public.gne jsoncallback = jsonp1294786450519 &安培;标签=猫&安培; tagmode =任何&安培;格式= JSON

回复:

jsonp1294786450519({
        "title": "Recent Uploads tagged cat",
        "link": "http://www.flickr.com/photos/tags/cat/",
        "description": "",
        "modified": "2011-01-11T22:47:12Z",
        "generator": "http://www.flickr.com/",
        "items": [
       { .... rest of json

因此,您需要使用domain1

发送的回调来包装json

答案 2 :(得分:-1)

您可以从domain1检索JSON'feed',并在您的请求完成后将该数据作为参数传递给您自己的Javascript函数(在domain2上)(onComplete / onSuccess)。