领先一步
VMware 提供培训和认证,助力你快速提升。
了解更多举手示意:谁在使用 Facebook?有 Twitter 用户正在阅读这篇文章吗?
我认识的几乎每个人都在使用 Facebook、Twitter、LinkedIn 或其他社交网站。事实上,我认识的大多数人都在多个社交网站上保持活跃。根据最近公布的数据,Facebook 拥有超过 7.5 亿用户,Twitter 拥有超过 2 亿用户。连我妈妈也在使用 Facebook。
好的,现在可以把手放下了。
面对如此庞大的用户群体,很容易找到以业务为导向的动机来构建针对这些用户的应用程序。从更个人、更独立的角度来看,与社交网络服务合作也很有趣。开发一些你的朋友和家人会认识、理解甚至可能使用的东西会非常有成就感。除了“有趣”因素外,当你告诉人们你编写了针对这些平台的程序时,还会有一种“哇”的感觉。当你提到“Facebook”或“Twitter”时,每个人——甚至我的妈妈——都能至少理解你应用程序的某个部分。
一年多以来,我很幸运能够愉快地与 Facebook、Twitter 和其他类似服务合作。去年五月,Keith Donald、Roy Clarkson 和我开始探索构建社交和移动应用所需的条件。这促使我们开发了 Greenhouse 参考应用,并从中提取了可重用组件,这些组件演变成了 Spring Social、Spring Mobile 和 Spring Android 项目。
今天我很高兴地宣布 Spring Social 1.0 发布了,它是 Spring Framework 的一个扩展,使应用程序能够代表其用户连接到软件即服务 (SaaS) 提供商。既然 1.0 版本已经发布,我想花点时间回顾一下我们在过去一年中所做的工作,并重点介绍一些让我最兴奋的事情。
无论使用哪个版本的 OAuth,消费者应用程序都必须从提供商那里获取访问令牌,并在每次请求提供商 API 时发送该令牌。但获取和使用访问令牌的具体方式因 OAuth 版本而异。
我认为编写代码来处理 OAuth 版本和访问令牌并不是一个明智的时间利用方式。这就是我们开发 Spring Social 的原因,它能让你摆脱处理 OAuth 复杂性的困扰。Spring Social 的连接框架 的独特之处在于,你只需使用应用程序的密钥和秘钥(在向提供商注册应用程序时获得)进行配置,其余的事情它都会帮你处理。你无需关心使用的是哪个版本的 OAuth,如何在请求中发送访问令牌,或如何存储访问令牌以供长期使用。
应用程序获得服务提供商授权后,就可以使用用户授予的权限访问提供商的 API。每个提供商都通过某种形式的 RESTful 服务暴露其平台,并且 API 中的资源大多都有很好的文档记录。因此,你可以使用 Spring 的 RestTemplate 从应用程序中消费这些资源。但是,你仍然需要确保每个请求都带有访问令牌。你还需要处理将提供商 API 返回的数据绑定到 Java 对象的问题。而且,当出现问题时,你还需要处理 API 返回的任何错误。
但如果你使用 Spring Social,这些细节都将为你处理。Spring Social 提供基于 Java 的 API,这些 API 绑定到服务提供商的 REST API。这不仅使你能够用 Java 术语与提供商 API 交互,还确保对 REST API 的每个请求都带有访问令牌和签名。Spring Social 为 Facebook 和 Twitter 提供了完整的 API 绑定,并且还启动了对其他提供商的 API 绑定,例如 LinkedIn、TripIt、GitHub 和 Gowalla。
API 绑定还处理从提供商 API 返回的错误消息。每个 API 绑定的底层都有一个错误处理程序,它将提供商的任何错误消息转换为有意义的异常,你可以在应用程序代码中捕获和处理这些异常。考虑到提供商 API 返回的错误可能会很古怪,错误处理尤为重要。Facebook 的错误尤其令人费解,当问题与 OAuth 毫无关联时,它却经常报告 OAuth 错误。
例如,如果你的应用程序在向用户的 Facebook 主页发布消息时稍微过度热心,Facebook 将在响应中返回以下带有 HTTP 400 状态码的 JSON 对象
{"error":{"type":"OAuthException","message":"(#341) Feed action request limit reached"}}
HTTP 状态码和“type”字段都无法帮助了解具体出了什么问题。如果不是 Facebook 模块的错误处理程序,你就只能解析“message”字段来判断问题所在。但如果你使用 Spring Social 的 Facebook API 绑定,就会抛出 RateLimitExceededException。你可以向用户报告此问题、记录下来,或者干脆忽略它。但你无需直接处理 Facebook 返回的那些神秘错误。
Spring Framework(以及所有其他 SpringSource 项目)让我一直印象深刻的一点是,它的功能并不局限于 JAR 文件中包含的内容。如果框架无法完全满足你的需求,你可以实现某个接口或扩展某个类,使其实现你想要的功能。秉承这种可扩展性的传统,Spring Social 提供了多种机会来定制和添加超出开箱即用功能的能力。
例如,在持久化连接数据方面,Spring Social 提供了一个基于 JDBC 的连接仓库实现。但如果开箱即用的实现无法满足你的需求,你可以自行编写。可以参考 Spring Android 项目,了解如何扩展 Spring Social 以支持基于 SQLite 的连接持久化。
扩展 Spring Social 的另一种方式是 添加对新服务提供商的支持。你只需编写 API 绑定并配置连接支持即可。已经有一些社区主导的项目正在扩展 Spring Social,以添加对新 SaaS 提供商的支持。
谈到 Spring Social 社区……
连接框架、API 绑定和可扩展性是 Spring Social 的强大功能,使你的 Spring 应用程序能够接入用户的社交图谱。但除了功能之外,Spring Social 要想成功,拥有一个强大的社区也非常重要。因此,我特别自豪的是,围绕 Spring Social 项目正在形成一个活跃且不断发展的社区。
利用 Spring Social 的可扩展性,许多社区成员编写了扩展,包括……
除了这些代码贡献之外,我们现在已有 七个示例应用程序,每个都演示了不同的功能和用例。论坛中也有一些很棒的讨论,以及问题跟踪器中的想法和错误报告。我要感谢所有参与者迄今为止的贡献。
在发布 Spring Social 1.0 的这一年里,我们经历了很多令人兴奋的事情,而这个重要的版本也带来了许多令人期待的东西。现在我们有了一个强大、稳定的基础,我期待着 Spring Social 未来会如何发展。我很想看到对 Twitter 和 Facebook API 绑定的流式支持、用户管理功能、邀请系统、增强的 OAuth 提供商支持、更紧密的 Spring Security 集成等等。你想看到什么?
我希望你和我们一样,在使用 Spring Social 的过程中获得乐趣。请在评论中分享这个框架对你的帮助。我还邀请你参加我将于 9 月 29 日 (北美 | 欧洲) 举办的网络研讨会,届时我将对 Spring Social 项目进行现场演示。期待届时与你相见!