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

本文将介绍一个快速的附带项目-一个自动从各种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

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

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

相关文章

下拉菜单

<!Doctype html> <html> <head> <meta charset"utf-8"> <title>下拉菜单</title> <style> *{ margin:0; padding:0; } ul{ list-style:none; overflow:hidden; background-color:#333; } li{ float:left; } li a,.drop…

51Nod 1753 相似子串

题目大意: 两个字符串相似定义为&#xff1a; 1.两个字符串长度相等 2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不相同 给定一个字符串&#xff0c;每次询问两个子串在给定的规则下是否相似。给定的规则指每次给出一些等价关系&#xff0c;如‘a’b&#xff0c;‘…

deepin下Clion连接mysql_CLion如何添加依赖库 ? 需要把mysql/Connector c++放入 用cpp连接数据库...

目前我把下载的mysql/Connector 下载后放在了project内 但是报错信息如下报错信息如下In file included from /Users/wsgdrfz/study/c/Libary_System/librarySystem/sqlConnection.h:/Users/wsgdrfz/study/c/Libary_System/librarySystem/sqlFiles/include/mysql_connection.h7…

[开源JVM] yvm - 自制Java虚拟机

中文 | English | | | YVM是用C写的一个Java虚拟机&#xff0c;现在支持Java大部分功能&#xff0c;以及一个基于标记清除算法的并发垃圾回收器. 不过还有很多bug等待修复。 感兴趣的朋友pull request/fork/star吧。 Github repo https://github.com/racaljk/yvm 已支持语言…

MacOSX环境上的多个Java JDK

同样&#xff0c;这是在Mac&#xff08;OSX 10.8.x &#xff09;上配置Java开发环境的一个小技巧。 如果您现在真的开始&#xff0c;我建议您阅读我以前的文章之一 &#xff0c;这是一种快速&#xff0c;干净的方法&#xff08;我想&#xff09;来设置环境变量并开始Java编码。…

浏览器的标准模式和怪异模式

面试题之浏览器的标准模式和怪异模式 1.浏览器的标准模式和怪异模式到底是什么&#xff1f; 标准模式&#xff1a; 是浏览器按照W3C标准解析执行代码&#xff0c;这样用规定的语法去渲染&#xff0c;就可以兼容各个浏览器&#xff0c;保证以正确的形式展示网页。 怪异模式&…

printf函数输出超出int时怎么办

int、long、long long在printf中的格式 https://blog.csdn.net/fz_ywj/article/details/8107582 蓝桥杯 2796. BASIC-11 十六进制转十进制 从键盘输入一个不超过8位的正的十六进制数字符串&#xff0c;将它转换为正的十进制数后输出。   注&#xff1a;十六进制数中的10~15…

升级glibc的影响_Java 11 升级:“债务”“危机”

导读&#xff1a;AJDK11(阿里内部基于openJDK11的定制版本)在19年3月左右发布&#xff0c;到现在也快1年了&#xff0c;不过目前整体使用的面还是比较窄&#xff0c;特性被了解的也不是很多&#xff0c;Java11作为OpenJDK发布的LTS版本&#xff0c;对我们来说&#xff0c;还是需…

The processing instruction target matching [xX][mM][lL] is not allowed.

原因&#xff1a;xml标签 必须在第一行。 转载于:https://www.cnblogs.com/wangkang0320/p/7569100.html

周五尾盘上涨,配合周末消息,周一套人的经典实例

吸取中国软件的教训&#xff1a;注意这次是温柔的&#xff0c;只是收了个十字星&#xff0c;因为前期上涨后的需要缓和调整一下&#xff0c;而不是为了出逃。以后注意找个出逃的例子1、上周五尾盘上涨2、周末利好消息3、周一开盘高开4、高开后快速下探&#xff08;5分钟内&…

Spring Data,MongoDB和JSF集成教程

示例应用程序简介&#xff08;MongoShop产品目录&#xff09; 在学习完本教程之后&#xff0c;将构建具有以下功能要求的示例应用程序&#xff08;MongoShop产品目录&#xff09;&#xff1a; 1.搜索具有不同条件的产品&#xff08;例如&#xff0c;sku&#xff0c;产品类型&am…

表单元素

一、form form代表表单&#xff0c;功能&#xff1a;用于申明表单&#xff0c;定义采集数据的范围&#xff0c;也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里。<form> 标签用于为用户输入创建 HTML 表单。表单能够包含input元素&#…

本人用python刷题时的错误总结

本人新手&#xff0c;在leetcode刷题过程中出现过很多问题&#xff0c;也发现了很多方法&#xff0c;故在此总结&#xff0c;不定时更新。 1、在创建一个二维列表的时候&#xff0c;我之前会用 a [[0] * 5] * 5, 但是这样输出的结果往往会跟期待的不一样&#xff0c;我一直以为…

增加 jQueryValidate的手机号验证功能

1、通过addMethod增加手机号的验证方法 &#xff08;位置&#xff1a;和$(form).validate({}) 同级别&#xff09; //增加手机号验证规则$.validator.addMethod("isMobile", function(value, element) {var length value.length;var mobile /^(13[0-9]{9})|(18[0-9…

C++的STL中accumulate的用法

https://blog.csdn.net/u011499425/article/details/52756242

Hibernate继承:每个类层次结构的表

在本教程中&#xff0c;我们将看到如何在hibernate中实现继承。有3种方法可以在hibernate中实现继承。在本文中&#xff0c;我们将看到其中一种&#xff0c;即每个类层次结构一个表。 休眠中的继承&#xff1a; Java是面向对象的语言&#xff0c;继承是Java的主要功能之一。关…

锁 mysql_Mysql的锁(S锁和X锁的区别)

共享锁和排它锁Mysql的锁系统&#xff1a;shared lock 和 exclusive lock (共享锁和排它锁&#xff0c;也叫读锁和写锁&#xff0c;即read lock和write lock)读锁是共享的&#xff0c;或者说是相互不阻塞的写锁是排他的&#xff0c;一个写锁会阻塞其他的写锁和读锁在实际的数据…

爬取新闻

import requests from bs4 import BeautifulSoup urlhttp://news.gzcc.cn/html/xiaoyuanxinwen/ resrequests.get(url) res.encodingutf-8 soupBeautifulSoup(res.text,html.parser) 1. 用requests库和BeautifulSoup库&#xff0c;爬取校园新闻首页新闻的标题、链接、正文。 fo…

平衡二叉树的自顶向下递归和自底向上递归

没太搞懂自顶向下和自底向上的递归区别