技术开发 频道

基于Facebook和Flash平台应用架构解析

FBML Facebook应用

    现在,你已经对iFrame应用的工作原理有了一个大致把握,接下来我们讨论FBML Facebook应用(见图2)。在前面,你的应用是存在iFrame中的一个独立实体,现在,它将变成Facebook服务器响应请求时返回的HTML 页面的一个部分。在这种情况下,Facebook服务器会代为处理所有对你的应用的调用。当然,除了返回HMTL和JavaScript,你的服务端页面也可以返回FBML代码,Facebook服务器在将它返回给用户浏览器前,会自动将其转换为HTML和JavaScript代码。

    图2 FBML Facebook应用架构

 1.   当用户在Facebook网站上访问你的应用时,浏览器会向Facebook服务器发送一个HTTP请求。

 2.   Facebook服务器将请求转给你的服务器,一般来说都是请求一个服务端页面(如PHP、ColdFusion或JSP)。在这种情况下,Session信息将通过POST请求(而iFrame通常是GET请求)中的URL参数传递,这样你的应用服务器就知道此请求来自 Facebook,以及请求的发送用户是谁。

 3.   服务端页面执行时,可能会根据需要访问数据库或其他服务器,其中也包括通过REST API向Facebook服务器发出请求。调用REST API时,必须包含认证信息,比如在Facebook上注册应用时获得的API Key、该调用的签名(通过传给Facebook方法的参数、用户请求你的应用时指定的Session的MD5哈希串生成)、应用的密钥和其他信息。 和iFrame应用一样,服务端页面通常都借助一个代码库生成对Facebook的请求和签名。因为所有返回都是通过Facebook代理的,你的应用请求Facebook服务器时,就没必要每次单独调用一个API。 FBML提供了大量 标签,可用于获得用户姓名、图片、创建对话框和小组件等。对于这类要求,你只需要直接返回FBML代码,后面的工作留给Facebook服务器就可以了,它在将页面返回给用户浏览器前,会自动将FBML转换为HTML和JavaScript代码。当然,不是所有功能都有标签支持的,比如要取得朋友的生日信息,还是得从你的服务器向Facebook发送对应的API调用请求。

 4.   Facebook服务器向你的服务器返回被请求的数据,格式是XML或JSON。

 5.  你的服务器向Facebook服务器返回HTML/JS/FBML页面。

 6.   Facebook服务器将HTML/JS页面返回给用户浏览器。在用户和你的应用交互过程中产生的交互行为包括:

     ·    如果你的应用包括新的服务端页面请求,重复步骤1-6。

     ·    不同于请求新的页面,你应用程序中的JavaScript可通过使用官方提供的JavaScript库直接向Facebook服务器发出请求(同上面iFrame讨论中的7-10步骤)。

    提示:虽然在FBML应用中,你也可以向你的应用服务器发出异步请求(同图1的步骤7-10),但这些调用必须位于通过<fb:iFrame> 标签在iFrame里加载的内容中。
 

    Flash iFrame Facebook应用

    至此,我们已经介绍了iFrame和FBML的情况,接下来开始讨论在应用中如何集成Flash内容的问题。虽然你完全可以构建一个包含了 HTML/JavaScript/ActionScript的混合应用,但为了说明的方便,我们还是将注意力集中在基本的Flash应用层面——其全部视 觉效果和功能都封装在SWF文件(Flash Player可识别并渲染的、编译后的字节码格式)中。 在上述混合应用中,可以使用到多种API调用,比如服务端API、前面已讨论过的客户端JavaScript API,以及这里将讨论的客户端ActionScript API调用。 你可将SWF文件集成到iFrame或FBML应用中。图3说明了在iFrame应用中的简单实现方法。

    图3 Flash iFrame Facebook应用

 1.   用户在Facebook站点上访问你的应用时,浏览器向Facebook服务器发出一个HTTP请求。

 2.   Facebook服务器返回一个HTML/JS页面,其中包含Facebook站点容器和一个iFrame HTML标签。

 3.   用户浏览器向你的服务器请求包含在iFrame中的页面。和前面讨论过的情况不同,这个页面不再是一个服务端页面,而是一个简单的 HTML页面(内含SWF文件)。此时,Session信息仍通过GET请求的URL参数传递;你的服务器解析这些参数,并转换为内嵌的SWF所需的 flash参数,这样,在SWF中的ActionScript代码就可以根据这些参数,直接向Facebook服务器发出请求了。

 4.   你的服务器将HTML/JS页面返回给用户浏览器,并在iFrame中展示。

 5.   用户浏览器向你的服务器发出其他请求,即请求展示在iFrame中的HTML页面中内嵌的SWF文件。

 6.   你的服务器返回SWF文件。

    当用户和你的应用交互时,SWF可向Facebook服务器、或你的服务器发送异步请求。

     ·SWF文件中的ActionScript脚本直接访问Facebook服务器(步骤7-8)。你可以使用Google代码中的ActionScript 3.0 Library for Facebook Platform。

    出于Flash Player安全性的考虑,SWF文件只能从两类服务器获取数据:(1)提供SWF文件的服务器(这里即你的服务器);(2)有跨域策略文件(在文件中列 出了SWF来源服务器)的服务器。也就是说,若要你的SWF能直接访问Facebook服务器,Facebook服务器必须在跨域策略文件中开放了访问权 限。如果看过Facebook的跨域策略文件,你会发现它通过一个通配符,授予了来自任何服务器的SWF文件的访问权:

    <cross-domain-policy>

    <site-control permitted-cross-domain-policies="master-only"/>

    <allow-access-from domain="*"/>

    </cross-domain-policy>

     ·   你的ActionScript访问Facebook服务器时,必须像前面非Flash的iFrame和FBML应用部分讲到的那样,传送应用API Key和用于说明访问来自何处的签名信息。利用ActionScript 3.0 Library for Facebook Platform中的类可自动生成签名;为此,你只需向ActionScript session类的构造函数传入应用的API Key和密钥。

    但是,你不应在SWF文件以硬编码方式写入上述数据,因为SWF文件可用多种软件反编译。相反,SWF应该在运行时向你的服务器发出请求(可 HTTP或Flash Remoting方式),从而获得应用的密钥,接下来再传给ActionScript session类的构造函数,从而生成访问Facebook服务器时所需的签名。

    记住,此签名由下列信息组成:传递给Facebook服务器的URL参数、Session Key(用户访问你的应用时分配)的MD5哈希串、应用的密钥等。

    ·    若需实现任何服务端处理功能(如在你的服务器上保存某些数据),可在ActionScript代码中通过远程过程调用方法实现(见步骤 9-10)。对于利用Flex构建的Flash平台应用而言,这些方法包括HTTP、Web Service和Flash Remoting请求技术。其中最便捷的方法当属Flash Remoting——它通过开源的二进制Action Message Format (AMF)实现服务器和Flash Player间的数据交换。当然,服务端代码在向客户端返回数据之前,可根据需要访问Facebook服务器(此点未包含在图3中)。

   

0
相关文章