【问题标题】:How do I create a JSONP from an external JSON feed?如何从外部 JSON 提要创建 JSONP?
【发布时间】:2011-01-11 22:02:52
【问题描述】:

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

我在 domain1 上有一个纯 JSON 提要。

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

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

编辑 好吧,我还是很困惑。只是在网址末尾添加回调就破坏了它。我怎样才能做到这一点,而不是提要的远程路径,而是拉出此代码位于 www.domain2.com 但提要位于 www.domain1.com 的绝对路径?

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

$.getJSON(feed,function(data) {

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

       do something here...
   }        

}

【问题讨论】:

  • 为什么feed 是绝对的?还有你的方法是什么? tag?你不能使用查询字符串吗?
  • 我需要绝对的提要,因为我正在制作一个将在 domain2 上运行的模块,但提要托管在 domain1 上。这就是设置提要网址的方式。

标签: javascript jquery cross-domain


【解决方案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 支持内置到您正在使用的服务器中,否则没有仅限客户端的解决方案...

【讨论】:

    【解决方案2】:

    阅读 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&tags=cat&tagmode=any&format=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

    【讨论】:

    • 所以提要将代替“/event/json.tag/tag/food”到“domain2.com/event/json.tag/tag/…?”
    • 完全正确。之间我猜.com之后的额外斜线是错误的,对吧?
    • 但是在 domain1 上,您需要确保 callback 的值像这样围绕 JSON:callback_value({JSON:""});content-type 应该是:text/javascript 而不是 @987654338 @ 如果您无法控制 domain1 的输出,则需要构建一个包装脚本来从 domain2 上的 domain1 中提取数据(可能是 php 脚本)并将其作为 JSONP 或只是 JSON 返回,因为现在您在同一个域。
    • 没用。我做了domain.com/…?但萤火虫表明这并没有拉任何东西。如果我远程拉它工作正常。
    • @sholsinger:我猜你的意思是相反的,因为 domain2 在他的情况下是 server...无论如何谢谢,我会更新我的答案
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      相关资源
      最近更新 更多