??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
理想情况下,(zhn)希望设计一个用戯为十分好用或者充满乐的应用E序。它使得用户能够通过 Facebook |络同他们的朋友q行沟通。?zhn)不能保证一个成功的应用E序Q这依赖于应用程序的核心概念Q,但是(zhn)可以保证如果这个概忉|成功的,那么(zhn)的应用E序可以被很好地集成?Facebook q_之中Qƈ且通过市场和虚拟的口口怼不断提升。所以,(zhn)可以从以下角度来看待问题:(x)如何创徏一个能够大q提高用戯通性的应用E序Qƈ且通过 Facebook 的集成点扩大(zhn)的用户基础Qƈ且鼓q户随旉地的同?zhn)的应用程序进行交互?/p>
Facebook 为?zhn)的应用程序提供了许多集成点?x)其中两个主要的区域分别被UC应用E序的画布页面和剖面盒,除此之外Q还有大量的辅助集成炏V?/p>
(zhn)通过q些辅助点的最H出的和无所不在?Left Nav 讉K一个应用程序的d面。Left Nav ?Facebook 的左侧导航栏中的一个链接,它将 Facebook 中的所有其他的面整合hQƈ且列Z所有的当前用户已安装的应用E序Q除非用户在安装应用E序时去掉了q一选项Q。D例来_(d)(zhn)可以点ȝ册应用程序的 Left Nav 链接Q请参见?8 中所C)?/p>
?8. 左侧定位链接
最后,用户可以通过 Applications 应用E序在他们的环境中限制一个应用程序的集成点,Applications 应用E序列出了所有已l安装的E序Q允许?zhn)对其q行删除或者编辑操作。点?Edit Settings 打开标准U有讄H口Q请参见?28 所C)?/p>
?28. 标准U有讄对话?/strong>
q里是私有设|的详细信息Q?/p>
在完成这些标准私有设|之后,应用E序q会(x)提供其定刉|窗口,(zhn)可以通过标准U有讄H口中的 Other Privacy Settings 链接q行q一步的讄Q请参见?29 所C)?/p>
?29. 在标准私有设|对话框中的另一个私有设|链?/strong>
现在Q?zhn)已经回顾了用于集成(zhn)的应用程序的可用点,下面我们看一下如何ؓ(f)q些不同的集成点创徏(zhn)的应用E序的内宏V?/p>
![]() ![]() |
![]()
|
(zhn)需要提?Facebook 可以嵌入到其面中的内容Q但是?zhn)不能像在?zhn)自q|站上那P使用直接?HTML ?Javascript。Facebook 需要确保内容不包含M恶意?JavascriptQƈ且希望应用E序可能简单地?Facebook 环境中的信息包含在?zhn)的提交内容中?/p>
Facebook 对于q一问题的解x法就?FBMLQF(tun)aceBook 标记语言Q,一U当 Facebook 提交(zhn)的应用E序的内Ҏ(gu)所使用?XML 语言。?zhn)可以?Facebook 认ؓ(f)是一个文本预处理器,像 XSLT 或?PHPQ它?yu)?FBML 内容转换?HTMLQ代替不同的 Facebook 标签下关于用h者环境的数据。ؓ(f)了取代失ȝ Javascript 功能QFacebook 提供?FBJS 语言QF(tun)aceBook JavaScriptQ。ؓ(f)了简化到 Facebook 数据库的复杂查询Qƈ且减所需的调用的数量QFacebook 提供?FQLQF(tun)aceBook 查询语言QSQL 的一个变体)。图 30 中描l了信息从?zhn)的应用程序服务器到用h览器的流E?/p>
?30. 从应用程序服务器到用h览器的信息通告的流E?/strong>
大多?FBML 标签在语法上?THML 标签都是一致的Q但?FBML q提供了许多行ؓ(f)标签Q以?qing)?Facebook 数据库中提取信息q且包含在?zhn)的内容中的标{。?zhn)在W?2 部分中对相关内容做进一步的研究?/p>
至于 FBJSQF(tun)acebook JavascriptQ,它仅仅是做出某些修改后的 Javascript。Facebook 从语法上Ҏ(gu)常见?Javascript 代码q行了分析,q且在传递到览器之前做Z一些改变。它同样?DOM q行了修改,对于讉K和修改元素加入了限制。?zhn)在W?2 部分中看到更多关于这U改变的详细内容?/p>
Facebook q通过一?AJAX 对象提供了功能强大的 AJAX。所有的 AJAX h都通过 Facebook 的服务器被代理,从而(zhn)能够将 FBML 代码作ؓ(f)一?AJAX h的结果返回。Facebook 对于 FBML 代码的处理同它对其他代码的处理一P在适当的位|(比如 <fb:name>
Q插?Facebook 数据Qƈ且?zhn)?AJAX 调用被返回一个对象,该对象能够通过一?DOM 元素?setInnerFBML()
函数讄元素?#8220;内部 FBML”。出于安全性的原因QFacebook q不支持“内部 HTML”Q但是一?setInnerXHTML()
函数正在试之中?/p>
![]() ![]() |
![]()
|
WebSphere Application Server ?Facebook 的服务器之间的通讯
我们的应用程序运行在 WebSphere 之下Q它必须?Facebook q行通讯Q而且 Facebook 也必d(zhn)的应用E序q行通讯。Facebook 同?zhn)?PHP 脚本之间的通讯被限制在d面h中,在那里用户可以进行某些活动。当用户q入(zhn)的应用E序的画布页?URL Ӟhttp://www.facebook.com/JakeTestAppQ,Facebook 代理q一h到?zhn)的远E服务器 URLQhttp://myserver.url/FacebookTestApp/index.phpQ,q且(zhn)的 index.php q回 FBML。类似地Q?zhn)?FBJS 代码发出一?AJAX hQ它通过同样的代理ƈ且向(zhn)的服务器发求?(zhn)的应用E序q需要同 Facebook q行通讯Q在一个请求期间或者是提取信息或者是发送信息。它通过 Facebook ?REST 接口完成q一操作Q这是一个将 API 暴露为?zhn)可以通过不同的请求参数进行特定调用的 URL ?HTTP 接口Qƈ且返?XML 或?JSON。?zhn)无需担心q些 HTTP 调用或者返回数据的l节Q这是因?Facebook 提供?PHP、Java ?Javascript 客户机程序库 —?REST 接口周围的封套处?HTTP h的徏造,q且返回数据整理ؓ(f)在客hE序语言中可用的数据?/p>
![]() ![]() |
![]()
|
客户机程序库提供了一?Facebook 客户?API 对象Q它是一个将我们的方法调用{换ؓ(f)?Facebook 服务器的h的一个代理对象。D例来_(d)要获得当前用L(fng)朋友Q?zhn)只需要调用一?Facebook 对象上的函数卛_Q请参见列表 1 中所C)?/p>
列表 1. 通过 PHP 客户机程序库获得当前用户的朋?/strong>
$friends = $facebook->friends_get(); |
我们q可以将信息发送到 Facebook 中(对信息进行升U)。D例来_(d)剖面盒同d面的工作方式是不同的(请参?剖面?/a> ?d面 节Q。?zhn)q不是等?Facebook 查询(zhn)的服务器以获得一位用L(fng)剖面盒的内容Q而是必须在希望改变时发出明确地内宏VFacebook 随后剖面盒内容存储在它的服务器上。这样做的意义在于,如果剖面盒内容不存储?Facebook 上面Q那?Facebook 在每次查看包含(zhn)的应用E序的用户剖面时讉K(zhn)的服务器,q且用户在讉K其他用户的剖面时p大量的时间。对于一个受Ƣ迎的应用程序来_(d)q将D大量的服务器负蝲Qƈ且在加蝲剖面面时加长等待时间。ؓ(f)了改变用户剖面上的?zhn)的应用程序的剖面盒的内容Q?zhn)只需要再ơ调用由 PHP 客户端程序库所提供?$facebook
对象上面的一个方法(请参见列?2 中所C)?/p>
列表 2. 在当前用L(fng)剖面面讄(zhn)的应用E序的剖面的内容
$facebook->profile_setFBML ('New profile box content', $user); |
每一ơ方法调用都?Facebook 发出一个明地h。随着(zhn)的应用E序变得愈加复杂Q?zhn)?PHP 代码也必d Facebook 查询来复杂的数据Qƈ且这些数据依赖于先前功能调用的结果。D例来_(d)(zhn)可能希望取得当前用L(fng)册中的所有h的名字,q需要?zhn)首先调?Facebook h所有的用户相册Q然后请求那些相册中的相片,然后h那些相片中的相片标签Q然后请求相片标{用户 —?大量的工作、大量的 Facebook 服务器请求、以?qing)大量?PHP 代码?/p>
![]() ![]() |
![]()
|
此外Q?zhn)可以使用单一?FQL 查询QF(tun)acebook 查询语言Q,它是 Facebook 提供的一U?SQL 的变体,用来直接查询数据库和核心应用E序的数据。FQL 只允许在 from
子句中出C个数据表Q但是允许在 select ?where 子句中用子查询Q所以下面的 FQL 查询所得到的结果同上面所描述的一_(d)标签用户的名字)Q但是在一个单一的查询中Q我们的代码会(x)更加明和易于dQ请参见列表 3 中所C)?/p>
列表 3. FQL CZ —?选择一个用L(fng)册中的所有标{L(fng)名字
select first_name from user where uid in (select subject from photo_tag where pid in (select pid from photo where aid in (select aid from album where owner = 563830447))) |
在列?3 中,563830447 是作者的 Facebook L(fng)。这一 FQL h返回一?XMLQƈ且作?Facebook REST 响应的一个实例(请参见列?4 中所C)?/p>
列表 4. FQL 查询响应
<?xml version="1.0" encoding="UTF-8"?> <fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true"> <user> <first_name>Jake</first_name> </user> </fql_query_response> |
(zhn)可以对此进行检验,q且通过 FBML 片段q行实验。用的工具?Facebook 的开发器试控制収ͼ(x)http://developers.facebook.com/tools.php?api Q请参见?31 所C)?/p>
?31. Facebook API 试控制?/strong>
使用 FBML、FBJS、FQL ?Facebook 客户机程序库Q?zhn)可以开发出一个能够很好地被集成到环境之中Qƈ且能够提供强大功能的应用E序。现在,我们可以开始创建我们的应用E序了?/p>
![]() ![]() |
建类Q借书?nbsp; pȝ理?nbsp; 图书工作员