本文以及接下来的一些博客通过演示Spring Social的使用来了解整个社交场景,而我将以非常基础的内容开始。
如果您看过Spring Social Samples,您会知道它们包含几个非常好的和完整的“ quickstart”应用程序。 一个用于Spring 3.0.x,另一个用于Spring3.1.x。 在研究这些应用程序时,让我印象深刻的是,您必须学习许多概念才能欣赏正在发生的事情。 这包括配置,外部授权,提要集成,凭证持久性等……大多数复杂性源于您的用户需要登录其软件即服务(SaaS)帐户(例如Twitter,Facebook或QZone)的事实,以便您的应用程序可以访问其数据1 。 由于周围有大量的SaaS提供程序以及它们使用的授权协议数量不同,这使情况更加复杂。
因此,我认为我将尝试将所有这些分解为各个单独的组件,以解释如何构建有用的应用程序; 但是,我将从一些背景开始。
Spring的家伙们正确地意识到,互联网上有如此众多的SaaS提供商,他们永远无法为所有这些提供商编写模块,因此他们将功能分为两部分,第一部分包括spring-social-core和spring-social-web模块,为每个SaaS提供程序提供基本的连接性和授权代码。 提供所有这些听起来像是一项艰巨的任务,但它的简化之处在于,要成为SaaS提供者,您需要实现所谓的OAuth协议 。 我还没有介绍OAuth的详细信息,但简而言之,OAuth协议执行了一个复杂的小操作,允许用户与您的应用程序共享其SaaS数据(即他们在Facebook等上拥有的东西),而无需用户分发他们的您的应用程序的凭据。 至少有三个版本:1.0、1.0a和2.0,并且SaaS提供程序可以自由实现他们喜欢的任何版本,通常会添加自己的专有功能。
此拆分的第二部分包括SaaS提供程序模块,这些模块知道如何与最低级别的各个服务提供程序服务器进行通信。 Spring的家伙目前提供 基本服务 ,西方世界是 Facebook , LinkedIn 和 Twitter 。 采用广泛的模块化方法的好处是,您还可以使用很多其他社区主导的模块:
- Spring社交500px
- Spring社交BitBucket
- Spring社交挖掘
- Spring社交保管箱
- Spring社交展
- Spring社交电影
- Spring社交四方
- Spring社交Google
- Spring社交Instagram
- Spring社交Last.fm
- Spring Social Live(Windows Live)
- Spring社会味iso
- Spring社交Mixcloud
- Spring社交Nk
- Spring社会销售人员
- Spring社交SoundCloud
- Spring社交活动
- Spring社交视频
- Spring社交活动
- Spring社交微博
- Spring社会兴
- Spring社交Yammer
- Spring社会保障模块
- Spring Social Grails插件
但是,这只是可用服务数量的一部分:要查看此列表的大小,请访问AddThis网站,并找出它们支持的服务。
返回代码
现在,如果您像我一样,那么在编程方面,您会讨厌安全性:从开发角度来看,这非常麻烦,会阻止您编写代码并使您的生活变得困难,所以我想我应该开始通过扔掉所有东西并编写一个显示一些基本SaaS数据的小应用程序。 事实证明,这可能是因为某些SaaS提供商(例如Twitter)同时服务于私有数据和公共数据。 私有数据是您需要登录的东西,而公共数据对任何人都可用。
在今天的场景中,我正在编写一个基本应用程序,该应用程序使用Spring Social Twitter Module在应用程序中显示Twitter用户的时间线,而您要做的只是Twitter用户的屏幕名称。
要创建该应用程序,第一步是使用SpringSource Toolkit仪表板的模板部分创建一个基本的Spring MVC项目。 这提供了一个Web应用程序,可帮助您入门。
第二步是将以下依赖项添加到pom.xml文件中:
<!-- Twitter API --><dependency><groupId>org.springframework.social</groupId><artifactId>spring-social-twitter</artifactId><version>${org.springframework.social-twitter-version}</version></dependency><!-- CGLIB, only required and used for @Configuration usage: could be removed in future release of Spring --><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>2.2</version></dependency>
上面的第一个依赖关系是针对Spring Social的Twitter API的,而第二个依赖关系是使用Spring 3的@Configuration注释配置应用程序所必需的。 请注意,您还需要通过添加以下内容来指定Twitter API版本号:
<org.springframework.social-twitter-version>1.0.2.RELEASE</org.springframework.social-twitter-version>
…到文件顶部的<properties>部分。
步骤3是您需要配置Spring的地方。 如果查看Spring Social示例代码,您会注意到Spring的家伙使用Java和Spring 3 @Configuration注释配置他们的应用程序。 这是因为基于Java的配置比基于XML的原始配置具有更大的灵活性。
@Configurationpublic class SimpleTwitterConfig {private static Twitter twitter;public SimpleTwitterConfig() {if (twitter == null) {twitter = new TwitterTemplate();}}/*** A proxy to a request-scoped object representing the simplest Twitter API* - one that doesn't need any authorization*/@Bean@Scope(value = 'request', proxyMode = ScopedProxyMode.INTERFACES)public Twitter twitter() {return twitter;}}
上面的代码所做的全部是通过Spring的Twitter接口为Spring提供一个简单的TwitterTemplate对象。 对于这个基本应用程序,使用@Configuration绝对是多余的,但是我将在以后的博客中继续使用它。
有关@Configuration批注和基于Java的配置的更多信息,请查看:
- Spring的基于Java的依赖注入
- 更多基于Spring Java的DI
编写完配置类后,接下来要做的就是整理控制器。 在这个简单的示例中,我使用了一个简单的@RequestMapping处理程序,该处理程序处理如下所示的URL:
<a href=timeline?id=roghughe>Grab Twitter User Time Line for @roghughe</a><br />
……代码看起来像这样:
@Controllerpublic class TwitterTimeLineController {private static final Logger logger = LoggerFactory.getLogger(TwitterTimeLineController.class);private final Twitter twitter;@Autowiredpublic TwitterTimeLineController(Twitter twitter) {this.twitter = twitter;}@RequestMapping(value = 'timeline', method = RequestMethod.GET)public String getUserTimeline(@RequestParam('id') String screenName, Model model) {logger.info('Loading Twitter timeline for :' + screenName);List<Tweet> results = queryForTweets(screenName);// Optional Step - format the Tweets into HTMLformatTweets(results);model.addAttribute('tweets', results);model.addAttribute('id', screenName);return 'timeline';}private List<Tweet> queryForTweets(String screenName) {TimelineOperations timelineOps = twitter.timelineOperations();List<Tweet> results = timelineOps.getUserTimeline(screenName);logger.info('Fond Twitter timeline for :' + screenName + ' adding ' + results.size() + ' tweets to model');return results;}private void formatTweets(List<Tweet> tweets) {ByteArrayOutputStream bos = new ByteArrayOutputStream();StateMachine<TweetState> stateMachine = createStateMachine(bos);for (Tweet tweet : tweets) {bos.reset();String text = tweet.getText();stateMachine.processStream(new ByteArrayInputStream(text.getBytes()));String out = bos.toString();tweet.setText(out);}}private StateMachine<TweetState> createStateMachine(ByteArrayOutputStream bos) {StateMachine<TweetState> machine = new StateMachine<TweetState>(TweetState.OFF);// Add some actions to the statemachinemachine.addAction(TweetState.OFF, new DefaultAction(bos));machine.addAction(TweetState.RUNNING, new DefaultAction(bos));machine.addAction(TweetState.READY, new ReadyAction(bos));machine.addAction(TweetState.HASHTAG, new CaptureTag(bos, new HashTagStrategy()));machine.addAction(TweetState.NAMETAG, new CaptureTag(bos, new UserNameStrategy()));machine.addAction(TweetState.HTTPCHECK, new CheckHttpAction(bos));machine.addAction(TweetState.URL, new CaptureTag(bos, new UrlStrategy()));return machine;}}
getUserTimeline方法包含三个步骤:首先,它包含一些推文,进行一些格式化,然后将结果放入模型中。 对于此博客,最重要的一点是掌握推文,您可以看到这是通过List <tweet> queryForTweets(String screenName)方法完成的。 此方法有两个步骤:使用Twitter对象获取TimelineOperations实例,然后使用该对象使用屏幕名称作为参数来查询时间线。
如果您查看Twitter界面,它将充当工厂对象,并返回其他对象来处理不同的Twitter功能:时间轴,直接消息传递,搜索等。我想这是因为开发人员意识到Twitter本身包含了如此多的功能,如果所有必需的方法都在一个类中,然后他们手上会有一个上帝对象 。
我还包括了将Tweets转换为HTML的可选步骤。 为此,我使用了State Machine项目和博客中的JAR,您可以在formatTweets(...)方法中查看其工作方式。
将Tweet的列表作为属性放入模型后,要完成的最后一件事情是编写一个JSP来显示数据:
<ul><c:forEach items='${tweets}' var='tweet'><li><img src='${tweet.profileImageUrl}' align='middle'/><c:out value='${tweet.createdAt}'/><br/><c:out value='${tweet.text}' escapeXml='false'/></li></c:forEach>
</ul>
如果您实现了可选的锚标记格式,那么这里要记住的关键是确保浏览器可以使用格式化的TweetHTML。 这可以通过使用c:out标记的escapeXml ='false'属性或将$ {tweet.text}直接放入JSP中来实现。
在此示例中,我没有包含任何样式或花哨的前端,因此,如果您运行代码2 ,则应获得以下内容:
以上就是我对Spring Social的简单介绍,但是仍然有很多基础。 在我的下一个博客中,我将了解背景情况。
1我猜这里有很多隐私和数据保护合法性问题要考虑,尤其是如果您使用此API存储用户数据时,我希望对此发表评论和意见。
2该代码可在GitHub上的git项目中的git://github.com/roghughe/captaindebug.git上找到。
参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Spring Social入门 。
翻译自: https://www.javacodegeeks.com/2012/06/getting-started-with-spring-social.html