Статьи

Начало работы с Spring Social

Как и я, вы не заметите спешку по «социализации» приложений, будь то добавление простой кнопки «Мне нравится» на Facebook, целая куча кнопок «поделиться» или отображение информации о временной шкале. Все делают это, включая парней из Spring, и, честно говоря, они придумали изящный API-интерфейс под названием Spring Social, который позволяет вам интегрировать ваше приложение с несколькими фидами Software as a Service (SaaS), такими как Twitter, Facebook, LinkedIn и т. Д.

В этом и следующих нескольких блогах мы рассмотрим всю социальную сцену, продемонстрировав использование Spring Social, и я собираюсь начать с самых простых.

Если вы видели Spring Social Samples, вы будете знать, что они содержат пару очень хороших и полных «быстрых» приложений; один для Spring 3.0.x и другой для Spring 3.1.x. При взгляде на эти приложения меня поразило количество концепций, которые вы должны выучить, чтобы оценить, что происходит. Это включает в себя настройку, внешнюю авторизацию, интеграцию каналов, сохранение учетных данных и т. Д. Большая часть этой сложности связана с тем, что вашему пользователю потребуется войти в свою учетную запись Software as Service (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 . Преимущество расширенного модульного подхода заключается в том, что вы также можете использовать целый ряд других модулей, управляемых сообществом:

Это, однако, лишь малая часть доступных сервисов: чтобы посмотреть, насколько велик этот список, посетите веб-сайт AddThis и выясните, какие сервисы они поддерживают.

Вернуться к коду

Теперь, если вы похожи на меня, то, когда речь заходит о программировании, вы будете ненавидеть безопасность: с точки зрения разработки это много ошибок, мешает вам писать код и усложняет вашу жизнь, поэтому я решил начать Отбросьте все эти вещи и напишите небольшое приложение, которое отображает некоторые базовые данные SaaS. Оказывается, это возможно, поскольку некоторые поставщики SaaS, такие как Twitter, обслуживают как частные, так и общедоступные данные. Личные данные — это то, что вам нужно для входа, в то время как общедоступные данные доступны любому.

В сегодняшнем сценарии я пишу базовое приложение, которое отображает временную шкалу пользователя Twitter в приложении с использованием модуля Spring Social Twitter, и все, что вам нужно для этого, — это отображаемое имя пользователя Twitter.

Для создания приложения первым шагом является создание базового проекта Spring MVC с использованием раздела шаблонов панели инструментов SpringSource Toolkit. Это обеспечивает веб-приложение, которое поможет вам начать.

Второй шаг — добавить следующие зависимости в ваш файл pom.xml :

01
02
03
04
05
06
07
08
09
10
11
12
13
<!-- 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>

Первая зависимость, приведенная выше, относится к Twitter API Spring Social, а вторая требуется для настройки приложения с использованием аннотации @Configuration в Spring 3. Обратите внимание, что вам также нужно указать номер версии API Twitter , добавив:

1
<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.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Configuration
 
public 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 простой объект TwitterTemplate через его интерфейс Twitter . Использование @Configuration строго излишне для этого базового приложения, но я буду опираться на это в будущих блогах.

Для получения дополнительной информации о аннотации @Configuration и конфигурации на основе Java, посмотрите на:

  1. Внедрение зависимостей Spring в Java
  2. Больше Spring Java на основе DI

Записав класс конфигурации, вам нужно разобраться с контроллером. В этом простом примере я использовал прямой обработчик @RequestMapping, который работает с URL-адресами, которые выглядят примерно так:

1
<a href=timeline?id=roghughe>Grab Twitter User Time Line for @roghughe</a><br />

… и код выглядит примерно так:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
@Controller
 
public class TwitterTimeLineController {
 
 
 
  private static final Logger logger = LoggerFactory.getLogger(TwitterTimeLineController.class);
 
 
 
  private final Twitter twitter;
 
 
 
  @Autowired
 
  public 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 HTML
 
    formatTweets(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 statemachine
 
    machine.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 включает в себя так много функциональности, что если все необходимые методы были в одном классе, тогда у них был бы Божий объект на руках.

Я также включил необязательный шаг преобразования твитов в HTML. Для этого я использовал JAR из моего проекта и блога State Machine, и вы можете увидеть, как это делается в методе formatTweets (...) .

После добавления списка Tweet в модель в качестве атрибута, последнее, что нужно сделать, — написать JSP для отображения данных:

1
2
3
4
5
<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>

Если вы реализуете необязательное форматирование тега привязки, то здесь необходимо помнить, что отформатированный HTML-код Tweet воспринимается браузером. Это достигается либо использованием атрибута escapeXml = 'false' тега c: out, либо размещением $ {tweet.text} непосредственно в JSP.

В этот пример я не включил стили или причудливый интерфейс, поэтому, если вы запустите код 2, вы должны получить что-то вроде этого:

И это завершает мое простое введение в Spring Social, но есть еще много вопросов, которые нужно покрыть. В моем следующем блоге я посмотрю, что происходит в фоновом режиме.

1 Я предполагаю, что здесь нужно рассмотреть много вопросов, касающихся конфиденциальности и законности защиты данных, особенно если вы используете этот API для хранения данных ваших пользователей, и я хотел бы получить комментарии и замечания по этому поводу.

2 Код доступен на GitHub по адресу git: //github.com/roghughe/captaindebug.git в социальном проекте.

Ссылка: Начало работы с Spring Social от нашего партнера по JCG Роджера Хьюза в блоге Captain Debug’s Blog .