使用jQuery和Ajax跨域调用饭否API

一直对JavaScript比较发憷。昨天通读了一遍阮一峰力荐的DOM Scripting,算是对JavaScript基本了解;然后趁热打铁,对jQuery、Ajax也研究一番。我的理解是,JavaScript是比较基础、手动、复杂的语言,jQuery则是比较傻瓜、集成、高效率的东西。一旦掌握了前者,再来攻后者就比较顺手了。用起来也一样。

掌握了基本的语法之后,我想使用它来调用一下饭否的API。不过,遇到的一个问题是跨域调用难题。jQuery的Ajax只允许调用本地的url(POST、GET)。搜索发现,其实可以使用getJSON来跨域调用。比较著名的两个例子是:

  1. 豆瓣的API客户端代码,如下:
    $.getJSON("http://api.douban.com/movie/subject/2340927?alt=xd&callback=?", function(movie){
        var title = movie.title['$t'];
        ...
    });
  2. jQuery官方使用getJSON调用flickrAPI的例子:
    $.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;
              });
            });

于是,我模仿上面的例子,写出了饭否API的调用实现。当然,探索过程是比较曲折的,略过不谈。下面show一下我的探索。

显示最新一条消息

<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script> 
<script>
$(document).ready(function(){
$.getJSON("http://api.fanfou.com/statuses/user_timeline.json?format=html&callback=?",{id:"zhasm"},
	function(data,status){  
	var created_at=data[0].created_at;
	var msg=data[0].text;  
	alert(msg+":  "+created_at);
	});
 
});
</script>

可以添加一个循环,显示所取得的20组(或.length组)消息,输出到合适的地方。不赘述。

向饭否好送消息

根据饭否官方API文档,发布消息必须使用POST方式。这对于只能提供getJSON函数的jQuery来说显然是不适用的。不过,根据我以前的测试,发布饭否消息,还可以使用纯HTML+远程饭否API的方式,思路见使用html方法更新zuosa图文消息一文。现在学习了jQuery,并认识了jQuery Form Plugin,代码可以这样写:

<html>
<header>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>
<script src="http://malsup.com/jquery/form/jquery.form.js?2.27"></script>
<script type="text/javascript"> 
        // wait for the DOM to be loaded 
        $(document).ready(function() { 
            // bind 'myForm' and provide a simple callback function 
            $('#myForm').ajaxForm(function() { 
                //alert("Thank you for your comment!"); 
				return false;
            }); 
        }
		return false;
		); 
    </script>
</header>
 
<form id="myForm" onsubmit="return false;" method="post" action="http://YOURFANFOUID:YOURFANFOUPASSWORD@api.fanfou.com/statuses/update.json"> 
    Name: <input name="status" />    
    <input value="Submit Comment" type="submit" />	
</form>
</body>
</html>

注意:由于需要验证身份,我直接将验证信息加在action的URL里了。如果您要测试这段代码,请修改相应的饭否ID和密码。

我的疑问是,在程序中我已经加上了“return false;”语句,以限制提交表单之后的页面刷新,可程序还是会自动下载生成的json文件,或转至生成的xml文件(取决于使用的type)。有没哪位前辈指点一下?

总结

虽然一般的jQuery的get/post操作不能跨域,但是对于callback友好的网站,还是可以通过getJSON的方式进行跨域提交的。熟读文档、研究示例、动手操作,就能一步步上手。前人的成熟经验也很值得借鉴。

2009年5月10日22:13
  • 2009年5月10日14:34 | #1

    严格上说,“callback 友好”的说法并不严谨,从原理上说其实是动态载入了一段 SCRIPT 运行然后传值。有个约定的称呼成这个技巧为 JSONP,详细兄弟可以看这里 http://ajaxian.com/archives/jsonp-json-with-paddi...

  • 2009年5月10日14:38 | #2

    好的,谢谢!

  • 2009年5月10日16:42 | #3

    当然传的这个值,就是 一个函数名,回调函数时候的函数名。
    http://cssrain.cn/article.asp?id=1341

  • 2009年5月10日16:45 | #4

    $(document).ready(function() {
    // bind 'myForm' and provide a simple callback function
    $('#myForm').ajaxForm(function() {
    //alert("Thank you for your comment!");
    return false;
    });
    }
    return false; // 这个多了一个return false 吧!!!
    );

    • 2009年5月13日13:29 | #5

      找到原因了,是我的js文件地址不对。网上给的是下载地址,我当成直接地址给调用了,实在初级的错误。

  • 2009年5月11日03:59 | #6

    到贵站看了一下,好多关于jQuery的文章。拜读了。

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">