关于JSON-P格式的3个问题

时间:2010-04-18 18:18:56

标签: jquery json cross-domain jsonp

我必须编写一个将在不同域上托管的脚本。该脚本必须从我的服务器获取信息。

所以,stackoverflow的用户告诉我,我必须使用 JSON-P格式,经过研究,我将要做的事情。 (JSON-P中提供的数据用于显示我的服务器托管在其他网站上的一些信息)

  1. 如何从服务器输出JSON-P ?是否与json_encode

  2. 中的PHP函数相同
  3. 如何为输出JSON-P设计树模式 (你知道,如:({“name”:“foo”,“id”:“xxxxx”,“blog”:“http://xxxxxx.com”}); 我可以从我的XML输出中窃取它吗? (http://bit.ly/9kzBDP

  4. 每次访问者浏览我的小部件所在的网站时,它都会在我的服务器上发出请求,请求在客户端显示JSON-P数据。 会大幅增加CPU负载(网站上有1个访问者,我的服务器上有脚本= 1 SQL请求输出数据),所以有没有办法'缓存' JSON-P信息输出每天仅刷新一次或两次并将其存储到'文件'(扩展名?)中。

  5. 但另一方面我会说直接请求JSON-P数据(不缓存它)是一个优点,因为,将集成脚本的网站只想显示他们的信息而不是整个数据。所以,制作一个类似的脚本:

    jQuery.getJSON("http://www.something.com/json-p/outpout?filter=5&callback=?", function(data) {
    ................);
    });
    

    过滤器 =网站要显示的信息。

    • 奖金问题:我是否必须使用JS框架来阅读JSON-P?或JS纯没有任何框架包含在页面上可以做到吗?

    您怎么看?

    非常感谢你 ;)

2 个答案:

答案 0 :(得分:2)

JSONP请求

$.ajax({
  type: "get",
  dataType: "jsonp",
  url: "mothership.com/widget_data",
  data: {whatever: "here", requested_from: "someonesblog.com" },
  cache: true,
  success: function(data, textStatus, XMLHttpRequest){
    // respond to ajax call here

    // debug: make sure your data is getting loaded properly
    console.log(data);

    // do other necessary things here
  }
});

从服务器

编码和输出JSON
<?php
  header("Content-Type: application/json");

  # You can access data from the jQuery.ajax() call with $_GET here

  $data = array(
    "name" => "foo",
    "id"   => 1234,
    "blog" => $_GET["requested_from"]
  );
  echo $_GET["callback"] . "(" . json_encode($data). ");" ;

  # this will output something like
  # jsonp1255285823({"name":"foo","id":1234,"blog":"someonesblog.com"});

  exit;
?>

答案 1 :(得分:2)

您可以使用json_encode函数获取对象的JSON字符串表示形式,然后在其周围添加填充,即:

$json = json_encode($myObj);
echo $callback . "(" . $json . ");";

大多数JSON结构都会严格复制XML结构和命名约定。没有后代的单个节点成为属性,重复的XML节点将是JSON数组,具有后代的节点是对象。请参阅http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=396,了解以两种格式表示的数据的正确并排视图。

至于在服务器上缓存数据,如果流量不是太大,大多数缓存方法可能有点过分。如果您仍然坚持需要,请参阅this answer我自己的一个问题和this answer recommending memcached。您可以使用客户端缓存控制标头expires来确保客户端仅在多个页面/刷新时提取数据一次。

奖励回答:JSON-P的美妙之处在于你不需要任何库来解析它。格式是纯javascript,将JSON-P添加到页面就像向页面添加脚本一样简单:

<script 
   type="text/javascript" 
   src="http://myurl.com/jsonp.php?callback=test&filter=5">
</script>