2.7 结束Hello World,开始获取Tweet
好了,毕竟这本书的名字不是“精通Hello World”,我们结束这一话题。借助Spring,使用Twitter的API进行查询是非常容易的事情。
2.7.1 注册应用
在开始之前,我们需要在Twitter的开发者控制台中注册应用。
访问https://apps.twitter.com,并创建一个新的应用。
根据你喜好为其设定一个名称,在Website和Callback URL区域中,输入http://127.0.0.1:8080(见图2-6)。这样的话,就能在本地机器上,测试开发阶段的应用。
图2-6
现在,导航至“Keys and Access Token”,并复制Consumer Key和Consumer Secret,稍后我们会用到它们,参见图2-7所示的截图。
图2-7
默认情况下,应用会具有只读的权限,对于该应用来说,这就足够了,但是如果你愿意的话,可以对其进行调整。
2.7.2 搭建Spring Social Twitter
添加如下的依赖到build.gradle文件中:
compile 'org.springframework.boot:spring-boot-starter-social-twitter'
添加如下的两行代码到application.properties中:
spring.social.twitter.appId= <Consumer Key>
spring.social.twitter.appSecret= <Consumer Secret>
这是与刚才所创建的应用相关的key。
我们将会在第6章中详细介绍OAuth。就现在而言,只是使用这些凭证信息发送请求到Twitter的API上,以满足我们应用的需要。
2.7.3 访问Twitter
现在,就可以在控制器中使用Twitter了,将它的名字改为TweetController,从而能够以更好的方式反映其新功能:
@Controller
public class TweetController {
@Autowired
private Twitter twitter;
@RequestMapping("/")
public String hello(@RequestParam(defaultValue =
"masterSpringMVC4") String search, Model model) {
SearchResults searchResults = twitter.searchOperations().
search(search);
String text = searchResults.getTweets().get(0).getText();
model.addAttribute("message", text);
return "resultPage";
}
}
我们可以看到,上面的代码会搜索匹配请求参数的Tweet。如果一切运行正常的话,结果中第一条记录的文本将会显示出来(见图2-8)
图2-8
当然,如果搜索没有得到任何结果的话,这段蹩脚的代码将会因为ArrayOutOfBoundException异常而导致失败。因此,可以抓紧发一条Tweet来解决这个问题!
如果想展现Tweet列表的话,那该怎么办呢?让我们修改一下resultPage.html文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8"/>
<title>Hello twitter</title>
</head>
<body>
<ul>
<li th:each="tweet : ${tweets}" th:text="${tweet}">Some
tweet</li>
</ul>
</body>
</html>
th:each是由Thymeleaf所定义的标签,它允许我们遍历一个集合并且能够在循环中将集合中的每个值赋给一个变量。
我们也需要修改控制器:
@Controller
public class TweetController {
@Autowired
private Twitter twitter;
@RequestMapping("/")
public String hello(@RequestParam(defaultValue =
"masterSpringMVC4") String search, Model model) {
SearchResults searchResults = twitter.searchOperations().
search(search);
List<String> tweets =
searchResults.getTweets()
.stream()
.map(Tweet::getText)
.collect(Collectors.toList());
model.addAttribute("tweets", tweets);
return "resultPage";
}
}
注意,我们在这里使用了Java 8的流来收集Tweet的信息。Tweet类包含了很多其他的属性,如发送者、转推的数量等。但是,现在我们尽可能地保持简单,如图2-9中的截图所示。
图2-9