关于jquery中 getJSON跨域访问

jquery1.2之后getJSON支持跨域访问
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
        function(data){
          $.each(data.items, function(i,item){
            $("<img/>").attr("src", item.media.m).appendTo("#images");
            if ( i == 3 ) return false;
          });
        });


这里需要注意的是远程接口的写法
调用的接口需要对jsoncallback参数进行解析
接口返回一个匿名函数的调用,与getScript类似
接口可以使用下列返回函数
//适用于getScript,getJSON调用
function return_data($json_string)
{
   $return_data = $json_string;
	if (isset($_GET['callback'])) 
	{
        $return_data = $_GET['callback']=='?' ? '('.$json_string.')' : $_GET['callback']."($json_string);";
	}
	echo $return_data;
	exit;
}


应用JSONP可以实现JSON数据的跨域调用。非常的幸运,JQuery1.2以后支持JSONP的应用。下面侧重说明在JQuery中,Json的跨域调用。

      应用JSONP实现Json数据跨域调用,需要服务器端与客户端的合作完成。引用Jquery官方的例子,客户端掉用如下:
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
        function(data){
          $.each(data.items, function(i,item){
            $("<img/>").attr("src", item.media.m).appendTo("#images");
            if ( i == 3 ) return false;
          });
        });
//第二种写法
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?",
  {
    tags: "cat",
    tagmode: "any",
    format: "json"
  },
  function(data) {
    $.each(data.items, function(i,item){
      $("<img/>").attr("src", item.media.m).appendTo("#images");
      if ( i == 3 ) return false;
    });
  });


    注意这里调用的地址中jsoncallback=?是关键的所在!其中,符号会被Query自动替换成其他的回调方法的名称,具体过程和原理我们这里不理会。我们关心的是jsoncallback=?起什么作用了?原来jsoncallback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什么工作呢?服务器要接受参数jsoncallback,然后把jsoncallback的值作为JSON数据方法名称返回,比如服务器是JSP,我们会这样做:
      ...
      String jsoncallback=request.getParameter("jsoncallback");
      ...
      out.print(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");
 

Jquery取得的数据可能如下:

     
JQUET0988788({"account":"XX","passed":"true","error":"null"})


总结,用JSONP要做两件事:
      1/请求地址加参数:jsoncallback=?
      2/服务器段把jsoncallback的值作为方法名传回来,如JQUET098788(...)

你可能感兴趣的:(jquery,json)