铸造坊 - Facebook
上个月,我描述了 Web/数据库开发领域中日益增长的趋势。开发人员不再满足于创建供人们消费的有趣的新应用程序。相反,越来越多的公司正在寻求创建基于服务的平台,其他开发人员可以在其上创建新的和有趣的应用程序。
例如,我们许多人认为 eBay 是一个处理在线拍卖的网站。这没错;归根结底,eBay 的收入来源是许多人在买卖东西。但 eBay 尤其成功,因为它提供的不是特定的应用程序,而是一个基础设施,买家和卖家可以在其上创建自己的应用程序。这些应用程序中的许多可能对普通用户是不可见的,但它们确实存在。已经有很多软件包可以帮助供应商定价、跟踪和销售他们的商品,并且也有类似的软件包是为买家设计的。
区分应用程序和平台非常容易。前者可能具有大量功能,但所有的更改和添加都来自一个中央开发人员团队。相比之下,平台包括软件库和/或 API,旨在使开发人员可以轻松地独立扩展和修改核心功能。随着平台越来越受欢迎,开发人员开始使用 API,一个小的软件生态系统开始扎根,使得与该生态系统竞争变得更加困难,因为太多人有既得利益来维持它的运行。
过去几年最大的平台成功案例之一是 Facebook。Facebook 最初的目的是成为哈佛(以及麻省理工学院,就此而言)新生刚到时获得的书籍的小型 Web 版本。Facebook 迅速发展壮大,提供了越来越多的功能,并扩展到其他大学的学生。然后 Facebook 邀请所有人——学生和非学生——成为会员。然后在 2007 年年中,Facebook 团队推出了 F8,即 Facebook 开发平台和 API。现在有成千上万的 Facebook 开发人员,尽管他们中的许多人正在创建琐碎或愚蠢的应用程序,但有些人正在创建有趣且有利可图的应用程序。此外,现在许多人更喜欢 Facebook 而不是竞争对手,例如 LinkedIn,部分原因是他们的朋友在 Facebook 上,但也因为他们可以安装和使用大量的 Facebook 应用程序库。
当然,对于 Web 开发人员来说,Facebook 不仅提供了一个我们可以使用的应用程序库,还提供了一个我们可以创建自己的应用程序的基础设施。本月,让我们涉足 Facebook 应用程序开发的领域,创建我们自己的简单应用程序,看看它如何与 Facebook 连接。
如果您已经开发 Web 应用程序一段时间了,您可能会想知道 Facebook 如何允许人们向正在运行的网站添加自己的代码。您是否将代码上传到虚拟服务器?您是否通过 Web 服务运行它?您是否在 Facebook 系统中使用宏语言编写它?
答案比这些可能性中的任何一个都简单。您在自己的服务器上运行 Web 应用程序,使用您选择的任何编程语言编写它,并包含您想要的任何功能。当有人通过 Facebook 调用您的应用程序时,Facebook 服务器会向您的 Web 应用程序发出请求。您应用程序的输出被传递给 Facebook,然后 Facebook 将其集成到页面中,最后将输出发送到用户的浏览器。换句话说,您可以将 Facebook 视为代理 HTTP 服务器,您可以将其配置为允许人们访问您的站点。
但是,当然,事情比这要复杂一些。当用户调用它时,您的 Web 应用程序可以访问有关该用户以及该用户的 Facebook 好友和网络的信息。因此,Facebook 可能会代表用户调用您的应用程序——并且在返回任何输出之前,您的应用程序将向 Facebook 发送许多查询,以了解有关当前用户的更多信息。这种来回通信速度非常快,至少在 Facebook 端是这样,但这确实意味着您需要考虑您真正想从 Facebook 请求哪些信息,如果您想确保您的应用程序以最高速度运行。
创建 Facebook 应用程序的第一步是通过访问 facebook.com/developers 添加 Developer 应用程序。(当您创建自己的应用程序时,人们也需要以类似的方式添加它。)
系统会询问您是否要添加 Developer 应用程序。Facebook 上的每个应用程序都有一个唯一的名称;我怀疑随着时间的推移,人们会囤积应用程序名称,就像他们对域名所做的那样。请注意,您需要明确同意添加应用程序,并且 Facebook 为您提供了许多保护隐私的选项。因此,您可以允许(或禁止)应用程序访问有关您的信息,在您的导航列表中放置链接,甚至在您主页的“动态”中发布故事。最后一项尤为重要;选中后,它允许应用程序写入您的个人动态,然后该动态将被您的朋友的主页拾取并显示。
一旦您添加了 Developer 应用程序,您现在就可以创建自己的应用程序了。请注意,只有那些想要创建新应用程序的 Facebook 用户才需要添加 Developer 应用程序;如果您只想使用应用程序,则实际上不需要它。
现在,是时候创建一个新应用程序了。如果您刚刚添加了 Developer,您将看到一个链接,询问您是否要创建您的第一个应用程序。如果您已经添加了 Developer,请转到 Developer 主页 (facebook.com/developers) 并单击“查看我的应用”。在任何一种情况下,您都将有机会创建一个新应用程序。每个开发人员几乎可以创建任意数量的应用程序,并且是免费的——所以不要认为您需要吝啬您创建的应用程序数量。
要创建应用程序,请单击标有“创建一个”的链接,或者如果您已经有一个应用程序,请单击“申请另一个密钥”。最简单的应用程序只有一个唯一的名称。但是,一般来说,您应该填写与应用程序关联的许多可选字段。因此,尽管您可以通过输入其名称并选中“我已阅读条款”框来创建应用程序,但您可能需要更多。因此,单击可选字段链接,并输入以下信息
支持电子邮件地址应该是您的,至少暂时是这样。
“回调 URL”应该是您服务器上的一个 URL,该 URL 连接到 Web 应用程序框架。在我们的例子中,我们将使用 Ruby on Rails 的开发系统作为我们的服务器应用程序。因此,回调 URL 将是 http://atf.lerner.co.il:3000/hello/facebook。
“画布页面 URL”应该是您再次输入应用程序唯一名称的地方。我为我的使用了 rmlljatf,因为这是我在 Linux Journal 中的专栏(铸造坊)的 Facebook 应用程序。您需要选择一个不同的名称。
您可以忽略许多设置,例如是否应使用 FBML(Facebook 标记语言,HTML 的超集)或 iframe,以及您想要 Web 应用程序还是桌面应用程序(在本例中,我们想要前者)。
我们 确实 希望人们能够在 Facebook 上添加我们的应用程序。但是,我们不希望新应用程序显示在我们的动态中,并且我们还希望将应用程序限制为正在开发它的开发人员。因此,尽管我们将单击“是”复选框以允许人们添加应用程序,但我们也应该单击更下方的开发人员模式复选框和下方的私有安装复选框。
填写完此表单后,按“提交”。如果表单不包含错误,您将收到通知,告知您的应用程序已成功创建。此外,您的新应用程序现在将显示在您的开发者页面上。其中,您的应用程序具有 API 密钥和密钥。这些是 32 个字符的字符串,Facebook 使用它们来确保您的应用程序和 Facebook 服务器被允许通信。
Facebook 现在已准备好与我们的 Web 应用程序通信——我们最好创建一个!正如我之前提到的,我正在使用 Ruby on Rails 创建一个与 Facebook 对话的简单 Web 应用程序。
现在,我可以自己完成所有艰苦的工作。我可以阅读 Facebook 文档,学习 API 并调试问题。或者,我可以从其他人完成的一些令人惊叹的工作中受益,并考虑我的应用程序,而不是与 Facebook 通信。
如果您正在使用 Ruby on Rails,您可以通过安装 Ruby gem(即代码和文档的预打包捆绑包)来做到这一点
gem install rfacebook
rfacebook gem 包含从应用程序与 Facebook 服务器通信所需的一切。但是,它不包含 Rails 应用程序所需的一些粘合代码。为此,您需要安装 Rails 插件。所以首先,让我们创建我们的 Rails 应用程序,指定 PostgreSQL 作为我们的数据库
rails -d postgresql rmlljatf
在 Rails 创建它需要的所有文件之后,我们现在可以安装 rfacebook_on_rails 插件
cd rmlljatf script/plugin install svn://rubyforge.org/var/svn/rfacebook/plugins/rfacebook_on_rails
请注意,为了使此工作正常进行,您需要安装 Subversion 客户端 (svn-client)。您还会发现,正如我所做的那样,如果您没有安装 Ruby SSL 库,RFacebook 将会神秘地失败。在我正在运行的 Ubuntu 机器上,我通过键入以下内容安装了它
apt-get install libopenssl-ruby
完成所有这些操作后,我们现在可以使用该插件为我们的系统配置 Facebook
rake facebook:setup
其中,这会在 config/facebook.yml 中为我们的 Facebook 应用程序创建一个配置文件。正如 rake facebook:setup 执行期间非常明确的注释所示,我们需要打开并编辑此文件才能使事情正常工作。当您打开它时,您会看到您需要输入您的 API 密钥和密钥(来自 Web 上的 Facebook Developer 页面)。在 canvas_path 旁边的 yourAppName 位置,输入您的应用程序名称。在我的例子中,它是 rmlljatf。并且,在 callback_path 位置,将其替换为您希望用于服务器上 Facebook 应用程序的 URL。在我的例子中,这只是 /hello/facebook。(这应该是一个相对 URL。)
让我们为我们的应用程序创建一个控制器
./script/generate controller hello
然后,删除文件 public/index.rhtml。
最后,在我们的 hello 控制器中创建一个简单的方法
def index render :text => "hello" end
果然,当我将浏览器指向 http://atf.lerner.co.il:3000/hello 时,控制器 (hello) 被调用,该控制器的默认操作 (index) 也被调用。并且,我在浏览器中以纯文本形式看到了“hello”。耶!
让我们编写更多一点代码来准备就绪。首先,让我们在我们的 hello 控制器中定义一个新方法
def facebook end
请注意,除了它存在之外,我们没有在该方法中定义任何内容。接下来,我们在 app/views/hello 中创建一个 facebook.rhtml 文件
<p>Hello, FacebookWorld!</p>
我们可以在 http://atf.lerner.co.il:3000/hello/facebook 看到结果,它显示
Hello, FacebookWorld!
经验丰富的程序员知道,查看日志文件是跟踪正在发生的事情的好方法。Rails 为每个环境包含一个日志文件,为您提供开发和生产环境的单独日志,以防它们安装在同一台计算机上的同一目录中。
如果我在调用 index 方法后查看开发日志 (logs/development.log),我在底部会看到以下内容
Processing HelloController#index (for 84.110.255.110 at 2007-09-12 08:26:08) [GET] Session ID: ef0e25ea44f91f3c900f54c4bca93506 Parameters: {"action"=>"index", "controller"=>"hello"} Completed in 0.00339 (295 reqs/sec) | Rendering: 0.00016 (4%) | 200 OK [http://atf.lerner.co.il/]
这些都不应该让我们感到惊讶,甚至应该让我们感到高兴。但是,如果我向上看,我会看到一些来自 RFacebook 插件的日志文件消息
** RFACEBOOK INFO: It looks like you don't have memcache-client, so MemCacheStore was not extended ** RFACEBOOK INFO: using default Rails sessions (since we didn't find an fb_sig_session_key in the environment)
看起来即使没有明确要求 RFacebook 做任何事情,它也已经开始四处查看并采取行动。第一条消息与 memcached 有关;虽然它可能对某些分布式应用程序有用,但我们目前不需要它。第二条注释表明我们的方法是直接调用的,而不是通过 Facebook 调用的,因此没有任何 Facebook 会话信息可以检索。因此,我们将使用常规 Rails 会话,而不是 Facebook 会话。
我们如何通过 Facebook 调用我们的应用程序?首先要做的是添加应用程序。转到开发者页面 (facebook.com/developers),然后单击应用程序的名称 (rmlljatf)。在该页面的右侧,应该有一个大的蓝色按钮,标记为“添加应用程序”。单击该按钮,单击下一页上的类似按钮,rmlljatf 应用程序将被安装。
现在,我可以将浏览器指向 http://apps.facebook.com/rmlljatf,我看到了什么?是的,您猜对了——一条可爱的小消息,说
Hello, FacebookWorld!
我们设法将浏览器指向 Facebook,Facebook 在我们的服务器上调用了应用程序,该应用程序返回了结果,然后这些结果显示在 Facebook 页面内。不错,对吧?
本月,我们看到了如何基本上将服务器上的 Web 应用程序与 Facebook 连接起来,在 Facebook 页面内显示输出。下个月,我们将研究我们的 Web 应用程序如何访问来自 Facebook 的信息,以多种不同的方式与 Facebook 数据库进行交互。
资源
Facebook:www.facebook.com
Facebook 开发者文档:developers.facebook.com/documentation.php?v=1.0
rfacebook:rfacebook.rubyforge.org
Reuven M. Lerner,一位长期的 Web/数据库开发人员和顾问,是西北大学学习科学博士候选人,研究在线学习社区。在芝加哥地区居住了四年后,他最近(与妻子和三个孩子)返回了他们在以色列莫迪因的家。