Facebook 平台详解

全球第 2大社交网站WebSitefacebook推出开发平台在几个月的内迅速走红在拒绝了 yahoogoogle等收购后狼子野心也暴露无遗它要做基于webOS在它开放发台上可以搭建集成任何应用游戏、工作、理财切都在facebook中了浏览器+facebook会成为以后人们生活方式吗?

然而不得不说facebook官方文档既乱且差 很多刚开发facebook应用人可能都会丈 2和尚摸不着头脑这篇日志算是 8卦+tutorial吧



、facebook介绍

这段纯属废话给那些不解facebook 又不愿意点链接人看

Facebook发源于哈佛大学是目前社会化网络和web2.0风向标这个网站WebSite目前全球排名第8位估值可能超过100亿美元而Facebook开放平台推出更是让互联网业内认为它是最有可能和Google比肩公司 Facebook创建于2004年2月这样高速增长和短短 3年多取得成就成为当今互联网发展个奇迹



(Facebook创始人兼CEO Mark Zuckerberg)



这里介绍更详细:

http://www.yeeyan.com/articles/view/thunder/2346



2、facebook platform

2007年5月24日Facebook推出应用编程接口(API)通过这个API第 3方软件Software开发者可以开发在Facebook网站WebSite运行应用这被称为Facebook开放平台(Facebook Platform)

没有什么比facebook创始人mark Zackerberg整理总结更好了:

"We want to make Facebook o something of an operating system so you can run full applications," Zuckerberg told me, saying it would be analogous to the platform that Microsoft Windows provides for developers.

去 http://www.facebook.com/apps/ 看看吧 那里应用真是应用尽有

读写网整理总结top 10 facebook apps也相当棒:

http://www.readwriteweb.com/archives/top_10_facebook_apps_work.php

http://www.readwriteweb.com/archives/top_10_facebook_apps_play.php



3、facebook 应用概述

1、平台开发环境

Facebook开发环境是LAMP 这套传统linux+apache+mysql+php架构尽管被很多java员和ruby员所不屑但它却仍然以绝对优势占据着主导地位

不过这对java员来说确实有点痛苦facebook官方包装java client相当更关键是它没有提供任何java开发web应用例子和文档幸亏还有些非官方tutorial地址附在后面



2、应用集成

谈到应用集成 我们首先想到是web services 和SOA这些被工业界吹了那么多年buzzword终于得到了推广然而值得讽刺是最后web services推广形式不是他们花了那么多年想出来SOAP标准而是最简单又不用任何标准RESTfacebook正是提供了堆REST Web services(从严格意义上说facebook所有service都是POST过去URL也没有完全遵守REST)

然而这个层面集成显然不能满足facebook作为web OS需要facebook需要让application运行在它提供平台上看看操作系统需要就能想象到facebookweb OS应用提供如何集成

在windows上我们需要安装应用软件Softwarefacebook提供了完整搜索、浏览、添加application方式

在windows上我们利用各种快捷方式让应用运行在自己平台里facebook提供了运行应用简单入口而所有应用都是在facebook内部展示

记得前几天看到篇文章将应用集成分为 3个层面:

1 基于web services和SOA应用交互

2 平台运行在内部服务器上而各种应用运行在外部服务器上这正是facebook方式

3 平台和应用都运行在内部服务器上

但是不知道他有没有想过第 3种集成方式扩展性和伸缩性是多么贫乏我相信facebook集成方式才是最好方式

Facebook这篇官方文档解剖了facebook应用集成到平台后各个界面展示:

http://developers.facebook.com/anatomy.php



4、facebook应用种类

Facebook提供了 3类应用:

External application

Iframe         

fbml

1、 external application没什么好说就是基于web services集成外部应用在经过facebook认证后可以facebook提供些web services

2、 Iframe集成也相当简单只是在facebook平台应用页面上放了个rame rame里跑是应用应用好象facebook里最火应用的top friends是用rame做但是由于rame天生限制使它无法完全集成facebook平台提供功能如fbml在页面显示上也有些怪

3、目前应用用最多还是fbml在fbml应用中facebook平台页面(下图所示菜单部分)和应用页面(如下图黄色部分)是无缝显示看上去完全象是个应用做想象成OS外部菜单栏更象是windows提供桌面和开始菜单黄色区域则是应用





在fbml应用中facebook平台主要起着中间人作用如下图所示



所有用户对facebook平台请求都被转到了应用url(在application 里可以配callback url)只不过是把所有请求变为post, 同时加上认证必需些参数最后返回html显示在facebookapplication区canvas里

但是这个中间人角色并不象想象中那么简单 它至少会引起以下问题:

1、httpsession信息丢失基本上现在httpsession都依赖于cookie中jsessionid但是经过中间人(facebook服务器)后cookie信息是无法获取也意味着httpsession是无法保存信息因此所有用户相关信息都是加在中转后reqeust参数里从request里userId 和sessionKey应用可以重建出用户所有信息 不过这倒反而实现了应用share nothing architectue对系统scalability是有好处

2、外部css丢失由于中转时候只去request callback url里页面所有外部css内容都是干掉应用只能在html文件里定义css这对于css狂们真是灾难

3、js丢失facebook会把页面中所有js给滤掉而取而代的用自己设计有限安全js语言这很重要部分原因是安全性但对于ajax狂来说这又是灾难



5、facebookauthentication

Facebook认证过程其实不复杂 但是如果java捧着官方提供java包捣腾恐怕还要费些功夫官方那个只提供了桌面应用

而web应用认证过程则大厢径庭

应用在注册时会获得该应用api_key和secret这实际上是访问该应用用户名和密码了只有开发人员可以看到事实上以后每次facebook api都会带上这api_key但这显然还不够登录用户必须拥自己特定信息:sessionKey每次带上这个key才能将用户信息关联(类似于tomcatjsessionid)因此认证主要目就是拿到sessionKey



上图是外部web应用认证过程这种应用只通过web services和facebook集成这种应用唯要做是获得取得web services权限上图流程很清楚了如果用java开发般先用个filter或其它erceptor拦截如果发现没有登录 facebook应用自动导到facebooklogin页面(在request参数里将登录完后回来页面传进去)登录后跳回到原来页面就可以在filter中通过request里authtoken获取sessionKey了这种应用般将认证后sessionKey放到HttpSession就可以了(以后不用重复认证)





上图是fbml应用认证过程事实上内部应用authentication远比外部应用简单但是官方竟然没提供文档由于facebook用户必须登录才能使用实际上在使用 facebook应用时用户已经登录并拥有了sessionKey和user_id等参数因此在中间人(facebook server)中转到应用url时它在request里会把sessionKey和userId等参数传进去因此在拿到这些参数后客户端可以直接进行任何web services



6、facebook api (RESTful web services)

Facebook提供了api有认证、用户、相册、好友等功能从使用角度来说这倒并不存在什么难点本身RESTapi就是个httpRequest请求过去返回个xmlresponse经过了官方或非官方包装以后就变成个简单思路方法

1、所有api都是无状态这也是facebook拥有这么好 scalability重要原因每个request里都会带上api_key, session_key, call_id, sig等参数这保证了安全性同时也保证了scalbility

2、java客户端包比起ruby来实在是恶心多了这个时候动态语言优势体现得太明显了利用rubymethod missing功能个简单实现就可以facebook所有api了而且扩展性好Java包里则定义了堆恶心思路方法而且返回个 xml document 经过解析才能取到结果



7、fql和fbml

Fql就是facebook版sql从使用角度来说fql其实挺简单它只是sql个子集 只支持单表查询where条件必须是索引过字段支持子查询 还支持些sql最简单例子:

SELECT name, pic FROM user WHERE uid=211031 OR uid=4801660



Fbml是facebook提供堆tag它只能在fbml应用中使用从使用角度来说也很简单以下html显示了个用户头像:

<td><fb:profile-pic uid="${friendId}" linked="true" /></td>



8、开发环境                      

开发外部facebook应用和ramefacebook应用不需要任何特殊配置但是开发fbmlfacebook应用却是另回事了从第 4节facebook as middleman图中我们可以看到facebook服务器要读到应用页面塞到facebookcanvas里这意味着应用页面必须是外网可以直接访问才能看到效果

而我们开发平台却是搭在本地 难道只有部署到服务器上才能看到页面效果?这对开发调是个严重挑战

后悔我当初没有看到这篇blog 利用SSHreverse tunnel功能可以将外网地址按端口号tunnel到本地开发环境

http://blog.evanweaver.com/articles/2007/07/13/developing-a-facebook-app-locally



我采用另种思路方法:增加middlemanfacebook本身起了个中间人作用将facebook请示导到了应用请求为什么我们不可以再增加个中间人 把外网请求导到内网?

幸好个几十行ruby _disibledevent=>
       cc=>'http://192.168.80.156/facebook/',

        :skt=>'http://192.168.80.133/facebook/'

    }





附  facebook平台开发非官方tutorial:



Ruby:

http://www.liverail.net/articles/2007/6/29/tutorial-on-developing-a-facebook-platform-application-with-ruby-on-rails

http://giantrobots.thoughtbot.com/2007/6/14/fist-in-your-facebook





java:

http://javablog.co.uk/2007/07/25/tips-for-writing-facebook-applications-in-java



http://tmachine1.dh.mark.co.uk/blog/index.php/2007/08/02/how-to-make-facebook-apps-using-java-part-1/



http://tmachine1.dh.mark.co.uk/blog/index.php/2007/08/13/how-to-make-facebook-apps-using-java-part-2/



http://tmachine1.dh.mark.co.uk/blog/index.php/2007/09/21/ten-tips-and-tricks-for-writing-facebook-apps/
Tags: 

延伸阅读

最新评论

发表评论