本文将介绍一个快速的附带项目-一个自动从各种Q&A StackExchange网站上发布热门问题的机器人,例如StackOverflow , ServerFault , SuperUser等。我们将为StackExchange API构建一个简单的客户端,然后进行设置使用Spring Social与Twitter API的交互-这第一部分将仅关注StackExchange Client。 此实现的最初目的不是要成为整个StackExchange API的完整客户端-这不在本项目的范围之内。 客户端存在的唯一原因是,我无法对与正式API的2.x版本兼容的对象进行罚款。

1. Maven依赖

要使用StackExchange REST API,我们将需要很少的依赖项-本质上只是一个HTTP客户端-Apache HttpClient可以很好地满足此目的:

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.2.3</version>
</dependency

还可以使用Spring RestTemplate与HTTP API进行交互,但这会在项目中引入很多其他与Spring相关的依赖项,这些依赖项不是严格必需的,因此HttpClient将使事情变得轻而易举。

2.问题客户

该客户端的目的是使用StackExchange 发布的/ questions REST服务,而不是为整个StackExchange API提供通用客户端–因此,出于本文的目的,我们仅着眼于此。 使用HTTPClient的实际HTTP通信相对简单:

public String questions(int min, String questionsUri) {HttpGet request = null;try {request = new HttpGet(questionsUri);HttpResponse httpResponse = client.execute(request);InputStream entityContentStream = httpResponse.getEntity().getContent();return IOUtils.toString(entityContentStream, Charset.forName('utf-8'));} catch (IOException ex) {throw new IllegalStateException(ex);} finally {if (request != null) {request.releaseConnection();}}
}

这种简单的交互非常适合获取API发布的原始JSON问题–下一步将处理该JSON。 这里有一个相关的细节-也就是questionsUri方法参数 -有多个StackExchange API可以发布问题(如官方文档所建议的那样),并且此方法必须足够灵活才能使用所有问题。 例如,它可以使用最简单的API(通过将questionUri设置为https://api.stackexchange.com/2.1/questions?site=stackoverflow来返回问题),也可以使用基于https://api.stackexchange.com/的标记取而代之的是2.1 / tags / {tags} / faq?site = stackoverflow API,具体取决于客户端的需求。

对StackExchange API的请求已完全配置有查询参数,即使是对于更复杂的高级搜索查询,也没有发送正文。 为了构造questionsUri ,我们将构建一个基本的流畅的RequestBuilder类,该类将使用 HttpClient库中的URIBuilder 。 这将确保正确编码URI,并通常确保最终结果有效:

public class RequestBuilder {private Map<String, Object> parameters = new HashMap<>();public RequestBuilder add(String paramName, Object paramValue) {this.parameters.put(paramName, paramValue);return this;}public String build() {URIBuilder uriBuilder = new URIBuilder();for (Entry<String, Object> param : this.parameters.entrySet()) {uriBuilder.addParameter(param.getKey(), param.getValue().toString());}return uriBuilder.toString();}
}

现在,为StackExchange API构造一个有效的URI:

String params = new RequestBuilder().add('order', 'desc').add('sort', 'votes').add('min', min).add('site', site).build();
return 'https://api.stackexchange.com/2.1/questions' + params;

3.测试客户端

客户端将输出原始JSON,但是要进行测试,我们需要一个JSON处理库,特别是Jackson 2

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.1.3</version><scope>test</scope>
</dependency>

我们将看到的测试将与实际的StackExchange API交互:

@Test
public void whenRequestIsPerformed_thenSuccess()throws ClientProtocolException, IOException {HttpResponse response = questionsApi.questionsAsResponse(50, Site.serverfault);assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
@Test
public void whenRequestIsPerformed_thenOutputIsJson()throws ClientProtocolException, IOException {HttpResponse response = questionsApi.questionsAsResponse(50, Site.serverfault);String contentType = httpResponse.getHeaders(HttpHeaders.CONTENT_TYPE)[0].getValue();assertThat(contentType, containsString('application/json'));
}
@Test
public void whenParsingOutputFromQuestionsApi_thenOutputContainsSomeQuestions()throws ClientProtocolException, IOException {String questionsAsJson = questionsApi.questions(50, Site.serverfault);JsonNode rootNode = new ObjectMapper().readTree(questionsAsJson);ArrayNode questionsArray = (ArrayNode) rootNode.get('items');assertThat(questionsArray.size(), greaterThan(20));
}

第一次测试已验证API提供的响应确实为200 OK,因此检索问题的GET请求实际上是成功的。 在确保基本条件之后,我们继续使用Content-Type HTTP标头指定的表示形式,该表示形式必须为JSON。 接下来,我们实际上解析JSON并验证输出中是否确实存在问题-解析逻辑本身是低级且简单的,足以满足测试目的。 请注意,这些请求计入API指定的速率限制 -出于这个原因,实时测试不包含在标准Maven版本中:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.13</version><configuration><excludes><exclude>**/*LiveTest.java</exclude></excludes></configuration>
</plugin>

4.下一步

当前的Client仅专注于StackExchange API发布的许多可用类型中的一种资源。 这是因为它的最初目的是有限的–仅需要使用户能够使用StackExchange产品组合中各个站点的问题 。 因此,可以改进客户端,使其超出此初始用例的范围,以能够使用其他类型的API 。 实现也非常原始 -使用Questions REST服务后,它只是将JSON输出作为字符串返回-而不是从该输出中输出任何类型的Questions模型。 因此,下一步可能是将JSON解组到适当的域DTO中,然后将其返回而不是原始JSON。

5.结论

本文的目的是演示如何开始与StackExchange API或实际上是基于HTTP的API建立集成。 它涵盖了如何针对实时API编写集成测试,以及如何确保端到端交互确实有效。

本文的第二部分将展示如何使用Spring Social库与Twitter API进行交互,以及如何使用我们在此处构建的StackExchange Client在新的Twitter帐户上发布问题。

我已经建立了一些Twitter帐户,现在每天在Twitter上发布各种学科的2个热门问题:

  • SpringAtSO –每天来自StackOverflow的两个最佳Spring问题
  • JavaTopSO –每天来自StackOverflow的两个最佳Java问题
  • AskUbuntuBest –每天来自AskUbuntu的两个最佳问题
  • BestBash –每天来自所有StackExchange网站的两个最佳Bash问题
  • ServerFaultBest –每天来自ServerFault的两个最佳问题

该StackExchange Client的完整实现在github上 。

参考: 使用Spring Social 推销StackExchange –第一部分,来自JCG合作伙伴 Eugen Paraschiv,来自baeldung博客。

翻译自: https://www.javacodegeeks.com/2013/02/tweeting-stackexchange-with-spring-social-part-1.html

通过Spring Social推特StackExchange –第1部分相关推荐

  1. stackexchange_通过Spring Social推特StackExchange –第1部分

    stackexchange 本文将介绍一个快速的附带项目-一个自动从各种Q&A StackExchange网站上发布热门问题的机器人,例如StackOverflow , ServerFault ...

  2. stackexchange_通过Spring Social发推StackExchange问​​题

    stackexchange 1.简介 这是有关小型辅助项目的第三篇也是最后一篇文章-该机器人自动在专用帐户上发布来自各个Q&A StackExchange网站上的问题的推文(文章末尾的完整列表 ...

  3. 通过Spring Social发推StackExchange问​​题

    1.简介 这是有关小型附属项目的第三篇也是最后一篇文章-该机器人自动在专用帐户上鸣叫来自各个Q&A StackExchange网站上的问题(文章末尾的完整列表). 第一篇文章讨论了为Stack ...

  4. Spring Social入门–第2部分

    几周前,我写了一篇文章,展示了我认为可以使用Spring Social编写的最简单的应用程序. 该应用程序读取并显示了Twitter用户的公共数据,并被编写为Spring Social和社交编码领域的 ...

  5. Spring Social入门

    像我一样,无论是添加简单的Facebook"赞"按钮,一大堆"共享"按钮还是显示时间轴信息,您都不会注意到当前对应用程序"社交化"的热衷. ...

  6. 自定义MongoDB的Spring Social Connect框架

    在上一篇文章中 ,我谈到了我面临的第一个挑战是更改数据模型并添加连接框架. 在这里,我想提供有关我如何做的更多详细信息. Spring Social项目已经提供了基于jdbc的连接存储库实现,以将用户 ...

  7. 为MongoDB定制Spring Social Connect框架

    在上一篇文章中 ,我谈到了我面临的第一个挑战是更改数据模型并添加连接框架. 在这里,我想提供有关我如何做的更多细节. Spring Social项目已经提供了基于jdbc的连接存储库实现,以将用户连接 ...

  8. Spring Security源码分析四:Spring Social实现微信社交登录

    2019独角兽企业重金招聘Python工程师标准>>> 社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯 ...

  9. Spring Security系列之Spring Social实现微信社交登录(九)

    社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...

最新文章

  1. styleable cannot be resolved or is not a field
  2. C中较为复杂的函数声明
  3. 一个简单好用的java增量更新工具
  4. 在MapPath的Path参数中不允许字符'..',解决方法。
  5. C语言判断两字符串同构,c语言实现判断两颗树是否同构
  6. 《OpenGL编程指南(原书第8版)》——计算着色器
  7. 不要进行过度设计,某一层存在真的有意义吗?是否可以更简单。
  8. 「镁客·请讲」HelloEOS梓岑:嘻哈外表下的区块链式达尔文主义
  9. iOS 新浪微博-5.3 首页微博列表_集成图片浏览器
  10. python keras_用Python/Keras/Flask/Docker在Kubernetes上部署深度学习模型
  11. 如何测一个纸杯_阿薇塔罗——4个吊坠,凭直觉选一个,测你这辈子婚姻状况如何?...
  12. java 添加图片到word中,并导出word到前端
  13. 蓝桥云课 鲁卡斯队列
  14. 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
  15. 【学习笔记】sed 命令及参数详解
  16. centos英文版下如何安装中文语言包
  17. 能够拿到100万年薪的程序员都具备哪些能力?
  18. maven 打包命令,只编译选择模块及其依赖模块
  19. day08-文本及csv文件操作
  20. 大连理工计算机管理专业硕士,2018年大连理工大学硕士研究生招生专业一览表...

热门文章

  1. stomp 连接错误: Whoops! Lost connection to http://localhost:8080/spring13/stomp 的解决方法
  2. 命令行执行Junit测试
  3. 段描述符表(GDT+LDT)的有感
  4. 文本替换sed+字段处理cut,join+awk重新编排字段
  5. apache derby_Apache Derby数据库JVM安全策略
  6. java github_GitHub Research:超过50%的Java记录语句写错了
  7. java timer开销_减少Java垃圾收集开销的5条提示
  8. di容器_DI容器是代码污染者
  9. java与java ee_计划Java EE 7批处理作业
  10. 1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法