了解如何使用 Spring 的 RestTemplate 检索 web 页面数据。

RESTful 架构,目前最流行的一种互联网软件架构,基于 HTTP,可以使用 XML 格式定义或 JSON 格式定义。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。


0. 前言

你将创建什么?

你将创建一个使用 RestTemplatehttps://gturnquist-quoters.cfapps.io/api/random 随机获取 Spring Boot 语录的程序。

https://gturnquist-quoters.cfapps.io/api/random 是一个 RESTful Web 接口,它会随机返回 Spring Boot 语录:

{
type: "success",
value: {
id: 10,
quote: "Really loving Spring Boot, makes stand alone Spring apps easy."
}
}

你将使用 RestTemplate 调用此接口,获取其响应的 JSON 数据。

https://gturnquist-quoters.cfapps.io/api/random 需要我们实现吗?

不需要,你可以将它看作第三方提供 RESTful Web 的接口,你需要调用它并获取它的响应。在应用开发时,我们常常需要对接第三方的服务,这篇文章就是引导你如何调用第三方的服务。

你需要什么知识?

  • 一款你熟悉的 IDE(如,IntelliJ IDEA)
  • Java 1.8 或更高的版本
  • Maven 3.2 或更高的版本

1. 创建初始项目

1.1 创建 Spring Initializr 项目

你可以使用 IntelliJ IDEA 进行创建项目,也可以在 Spring Initializr 进行创建。

1.2 导入 maven 依赖

pom.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lxiaocode</groupId>
<artifactId>consuming-rest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest-service</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<!-- spring web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

2. 获取 REST 资源

你现在已经完成对项目的初始设置,可以开始创建你的 Web 服务了。

https://gturnquist-quoters.cfapps.io/api/random 是一个 RESTful Web 接口,并且它会以 JSON 格式返回:

{
type: "success",
value: {
id: 10,
quote: "Really loving Spring Boot, makes stand alone Spring apps easy."
}
}

你可以在浏览器中使用该 RESTful Web 服务,也可以用代码来使用它。Spring Boot 提供了一个便利的模板类 RestTemplate。它使与 RESTful Web 服务的交互变得十分简单,它甚至可以将数据绑定到自定义对象中。

首先,你需要创建 Quote 类来包含所需的数据:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Quote {

private String type;

private Value value;

public Quote() {
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public Value getValue() {
return value;
}

public void setValue(Value value) {
this.value = value;
}

@Override
public String toString() {
return "Quote{" +
"type='" + type + '\'' +
", value=" + value +
'}';
}
}

它除了有一些字段和对应的存取方法之外,还有一个 @JsonIgnoreProperties 注解。

@JsonIgnoreProperties 注解是由 Jackson JSON 库提供的。它能在 Jackson JSON 转换 JSON 格式时,忽略该类不存在的字段。当 JSON 格式数据与类字段名不匹配时,也可以使用 @JsonProperty 注解指定 JSON 格式的键(Quote 字段与 JSON 返回的键相同,所以我们不需要使用)。

你还需要创建一个对应的 Value 类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Value {

private Long id;

private String quote;

public Value() {
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getQuote() {
return quote;
}

public void setQuote(String quote) {
this.quote = quote;
}

@Override
public String toString() {
return "Value{" +
"id=" + id +
", quote='" + quote + '\'' +
'}';
}
}

3. 使用 RESTful Web 服务

现在,你需要在 Spring Boot 启动类中添加一些内容,用于调用 RESTful Web 接口。

  • 一个 Logger 对象,将数据写入日志。
  • 一个 RestTemplate 对象,用于处理传入的数据。
  • 一个 CommandLineRunner 对象,用于运行 RestTemplate
@SpringBootApplication
public class ConsumingRestApplication {

private static final Logger log = LoggerFactory.getLogger(ConsumingRestApplication.class);

public static void main(String[] args) {
SpringApplication.run(ConsumingRestApplication.class, args);
}

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}

@Bean
public CommandLineRunner run(RestTemplate restTemplate){
return args -> {
Quote quote = restTemplate.getForObject(
"https://gturnquist-quoters.cfapps.io/api/random",
Quote.class);
log.info(quote.toString());
};
}
}

4. 运行程序

现在运行项目,你将会在控制台看到输出的日志:

2020-04-19 14:56:32.151  INFO 6588 --- [           main] c.l.c.ConsumingRestApplication           : Quote{type='success', value=Value{id=6, quote='It embraces convention over configuration, providing an experience on par with frameworks that excel at early stage development, such as Ruby on Rails.'}}

GitHub 项目源码


参考文献:Spring | Guides

评论