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

stackexchange

本文将介绍一个快速的附带项目-一个自动从各种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 Service之后,它只是将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

stackexchange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bandizip最后一个无广告版本_【软件来了】这是个无广告的旧版知乎

近两天有新加入粉丝团队的小伙伴在询问G先生旧版App的事情&#xff0c;文章已发过很久&#xff0c;但是知乎的旧版本还是头一次分享给大家&#xff0c;所以G先生就找到了两个版本的旧版知乎&#xff0c;知乎V3.1和知乎V3.9这两个知乎都支持在最高的系统&#xff0c;没有广告也没…

NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」...

题目比较神仙&#xff0c;注意是题目神仙 贪婪暗示贪心&#xff0c;堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1$就可以构成等差数列 例如 $2$ $4$ $16$ $2$与$4$差$2$ $4$与$16$差$1…

渴望订阅– RxJava常见问题解答

在教学和指导RxJava以及撰写本书之后 &#xff0c;我注意到某些领域尤其成问题。 我决定发布一些简短的提示&#xff0c;以解决最常见的陷阱。 这是第一部分。 Observable和Flowable本质上是惰性的。 这意味着无论您在Flowable放置了多么繁琐或长时间运行的逻辑&#xff0c;仅…

WPScan高级用法和定制

自定义扫描选项 WordPress作为一个广泛使用的内容管理系统&#xff08;CMS&#xff09;&#xff0c;为用户提供了丰富的自定义选项&#xff0c;使其能够根据特定需求创建个性化的网站。其中一个重要的自定义选项是自定义扫描选项&#xff0c;它允许用户对WordPress网站进行深度…

r语言中正定矩阵由于误差不正定_R语言之数据处理(一)

在上一篇小文中&#xff0c;提到了关于R语言导入数据的一些方法&#xff0c;之后的重点就转向了数据的处理上。数据处理其实在整个数据分析项目中所占用的时间是比较多的&#xff0c;所以根据处理的目的不同&#xff0c;也有不同的处理方法。在R语言中&#xff0c;我通常会将数…

【chromium】 渲染显示相关概念

DRM(Direct Rendering Manager) DRM 由两个部分组成&#xff1a;一是 Kernel 的子系统&#xff0c;这个子系统对硬件 GPU 操作进行了一层框架封装。二是提供了一个 libdrm 库&#xff0c;里面封装了一系列 API&#xff0c;用来进行图像显示。 说到这里&#xff0c;其实这么理解…

ASP.NET Core MVC 之区域(Area)

区域&#xff08;Area&#xff09;是一个 ASP.NET MVC 功能&#xff0c;用于将相关功能组织为一个单独的命名空间&#xff08;用于路由&#xff09;和文件结构&#xff08;用于视图&#xff09;。使用区域通过向控制器和操作添加 一个路由参数&#xff08;area&#xff09;来创…

esp32 arduino adc_英雄联盟手游射手出装怎么出 adc英雄出装推荐

2020-11-02 18:06:31 角色扮演 人气值&#xff1a;加载中...英雄联盟手游adc怎么出装备&#xff1f;英雄联盟手游虽然没有上线国服和台湾服&#xff0c;但是我们已经有很多热心的玩家在外服中研究出了各种射手的玩法&#xff0c;那么adc要怎么出装呢&#xff1f;小编已经准备…

camel.js_Camel 2.11 –没有Spring的Camel Web应用程序

camel.js在撰写本文时&#xff0c;我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件&#xff0c;该组件允许使用Camel运行Web应用程序&#xff0c;而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。 有点as愧地说&#xff0c;在2013年&#x…

宅男计划

题解 $dp$不行考虑三分 发现单峰 1.理性打表,得到单峰 2.感性思考,你会发现你买食物次数越多,你钱数越少,你买的好食品更多,你买食物次数越少,你钱数越多,然而你必须买一些价格贵保质期长弥补次数少. 单峰,我们三分就完了(其实也可以模拟退火,然而我参数爆炸了一直60分) 那么$c…

.net 后台 下载 图片_特殊的 “图片软件” !

01 引语简单的图片处理软件我说过不少&#xff0c;像windows自带的图片编辑、在线处理图片的稿定设计、或者ps的一些插件。虽然我知道这类工具型软件的文章&#xff0c;大多数小伙伴都只是随便看一眼&#xff0c;心里默念 “咦&#xff0c;好像有用&#xff01;”&#xff0c;…

流操作中的noException

本文介绍了一些简单的编码实践。 没什么好看的。 在StackOverflow上也进行了讨论。 您只是将一个庞大而复杂的循环重构为一个更具可读性的流表达式&#xff0c;而忘记了某些方法调用引发了异常。 包含此代码的方法将引发此异常&#xff0c;该异常在方法头中声明。 您不想在此级…

optimize table 需要多久_吉林市政工程资质新办需要多久

七。 暖通空调专业&#xff1a;水暖工程&#xff0c;建筑环境与设备&#xff0c;环境工程&#xff0c;暖通空调&#xff0c;供暖和通风与空调&#xff0c;制冷和空调&#xff0c;水暖&#xff0c;供暖和通风&#xff0c;HVAC&#xff0c;公共设备安装。如何申请第三级土木工程资…

Java EE 6 开发环境

软件安装&#xff1a; 选择 Glassfish 支持 Java EE 6 的最新版本 3.1.2.2根据 Glassfish 3.1.2 的 certification matrix&#xff0c;要求 JDK 1.6 update 29&#xff0c;因此&#xff0c;选择 JDK 6 最新版本 JDK 6u45选择 Eclipse Indigo&#xff0c;其之后的版本要求 JDK 7…

mysql连接不断线_某些小时后MySql连接自动掉线

mysql连接不断线MySql配置为删除任何闲置超过8小时的连接。 这意味着什么&#xff1f; 在8个小时的间隔后返回到已部署的应用程序之后&#xff08;如果未更改默认SQL参数&#xff09;&#xff0c;将会遇到异常情况。 如何解决这个问题&#xff1f; 增加wait_time参数-不是一个…

pb65 xp 安装无反应_长春优质AFB型耐腐蚀泵安装

长春优质AFB型耐腐蚀泵安装 k5b5b5s长春优质AFB型耐腐蚀泵安装 并及时更换轴套。而随着科技的不断发展&#xff0c;新式设备的问世&#xff0c;设备一般都开始被筛选。无密封自吸泵无密封自吸泵就是一种新式泵&#xff0c;该泵密封可靠&#xff0c;选用无泄漏密封设备&#xff…

虚函数探秘

C的多态分为动态多态和静态多态&#xff0c;其中静态多态主要靠重载和模板来实现&#xff0c;而动态多态则主要靠继承来实现了。 那么静态和动态&#xff0c;怎么算静&#xff0c;怎么算动呢&#xff1f;静态多指编译期能决定的事情&#xff0c;而动态多指运行时才决定的事情。…

Errai框架简介

Errai是Red Hat开发和维护的框架&#xff0c;旨在结合GWT和JEE世界的优点。 根据Red Hat的说法&#xff0c;Errai是基于GWT的框架&#xff0c;用于使用下一代Web技术构建富Web应用程序。 在此简单声明的背后&#xff0c;存在一种与GWT完全不同的开发方式&#xff0c;在下面的文…

动态壁纸安卓_高清无水印!这4款壁纸软件,让你的手机好看又独特

手机与我们每日相伴&#xff0c;我们总会精心挑选各种图片设置为手机壁纸&#xff0c;有时换个壁纸就像换了一种心情一样。但网上搜索的壁纸大同小异&#xff0c;有没有风格独特又有趣的&#xff1f;今天就给大家推荐4款各具特色的壁纸App&#xff0c;保证给你耳目一新的感觉。…

在线生成安卓APP图标

移动应用图标/启动图生成工具&#xff0c;一键生成所有尺寸的应用图标/启动图 在线生成安卓APP图标生成 图标在 线 在线图标 安卓图标 生成图标 https://icon.wuruihong.com/ 在线png图片压缩 png压缩 https://compresspng.com/zh/ 在线gif图片压缩 gif压缩 https://www.soog…