consuming-rest.md 9.7 KB
Newer Older
Miykael_xxm's avatar
Miykael_xxm 已提交
1 2
# 使用 RESTful Web 服务

茶陵後's avatar
茶陵後 已提交
3
本指南将引导您创建一个提供 RESTful Web 服务的应用程序。
Miykael_xxm's avatar
Miykael_xxm 已提交
4 5 6

## 你将建造什么

茶陵後's avatar
茶陵後 已提交
7
您将构建一个应用程序,该应用程序使用 Spring`RestTemplate` 请求 https://quoters.apps.pcfone.io/api/random 获得一个随机的 Spring Boot 引文。
Miykael_xxm's avatar
Miykael_xxm 已提交
8 9 10 11 12 13 14 15

## 你需要什么

- 约15分钟
- 最喜欢的文本编辑器或 IDE
- [JDK 1.8](http://www.oracle.com/technetwork/java/javase/downloads/index.html)或更高版本
- [Gradle 4+](http://www.gradle.org/downloads)[Maven 3.2+](https://maven.apache.org/download.cgi)
- 您还可以将代码直接导入 IDE:
茶陵後's avatar
茶陵後 已提交
16
  - [Spring Tool Suite (STS)](https://spring.io/guides/gs/sts)
Miykael_xxm's avatar
Miykael_xxm 已提交
17 18 19 20
  - [IntelliJ IDEA](https://spring.io/guides/gs/intellij-idea/)

## 如何完成本指南

茶陵後's avatar
茶陵後 已提交
21
像大多数 Spring[入门指南](https://spring.io/guides)一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。两种方式都会让您得到可以成功运行的代码。
Miykael_xxm's avatar
Miykael_xxm 已提交
22

茶陵後's avatar
茶陵後 已提交
23
**从头开始**,请参考[从 Spring Initializr 开始](https://spring.io/guides/gs/consuming-rest/#scratch)
Miykael_xxm's avatar
Miykael_xxm 已提交
24 25 26

**跳过基础知识**,请执行以下操作:

茶陵後's avatar
茶陵後 已提交
27 28 29
- [下载](https://github.com/spring-guides/gs-consuming-rest/archive/main.zip)并解压缩本指南的源代码,或使用[Git](https://spring.io/understanding/Git)克隆它:`git clone https://github.com/spring-guides/gs-consuming-rest.git`
- 进入项目中的 `gs-consuming-rest/initial` 目录
- 继续阅读[获取 REST 资源](https://spring.io/guides/gs/consuming-rest/#initial)
Miykael_xxm's avatar
Miykael_xxm 已提交
30

茶陵後's avatar
茶陵後 已提交
31
**完成后**,您可以对照`gs-consuming-rest/complete`中的代码进行检查。
Miykael_xxm's avatar
Miykael_xxm 已提交
32 33 34

## 从 Spring Initializr 开始

茶陵後's avatar
茶陵後 已提交
35
您可以使用这个[预先初始化的项目](https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.5.5&packaging=jar&jvmVersion=11&groupId=com.example&artifactId=consuming-rest&name=consuming-rest&description=Demo project for Spring Boot&packageName=com.example.consuming-rest&dependencies=web) 单击 Generate 下载 ZIP 文件。此项目的配置适合教程中的示例。
Miykael_xxm's avatar
Miykael_xxm 已提交
36 37 38 39 40 41

手动初始化项目:

1. 导航到[https://start.spring.io](https://start.spring.io/)。该服务提取应用程序所需的所有依赖项,并为您完成大部分设置。
2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
3. 单击**Dependencies**并选择**Spring Web**
茶陵後's avatar
茶陵後 已提交
42 43
4. 单击**Generate**
5. 下载生成的 ZIP 文件,该文件是根据您的选择配置好的 Web 应用程序压缩包。
Miykael_xxm's avatar
Miykael_xxm 已提交
44 45 46

如果您的 IDE 具有 Spring Initializr 集成,您可以从您的 IDE 完成此过程。

茶陵後's avatar
茶陵後 已提交
47
你也可以从 Github 上 fork 这个项目并在你的 IDE 或其他编辑器中打开它。
Miykael_xxm's avatar
Miykael_xxm 已提交
48 49 50

## 获取 REST 资源

茶陵後's avatar
茶陵後 已提交
51
完成项目设置后,您可以创建一个使用 RESTful 服务的简单的应用程序。
Miykael_xxm's avatar
Miykael_xxm 已提交
52

茶陵後's avatar
茶陵後 已提交
53
在 https://quoters.apps.pcfone.io/api/random 已经提供了一个 RESTful 服务。它随机将有关 Spring Boot 的引文作为 JSON 文档的形式返回。
Miykael_xxm's avatar
Miykael_xxm 已提交
54

茶陵後's avatar
茶陵後 已提交
55
如果您通过 Web 浏览器或 curl 命令请求该 URL,您会收到如下所示的 JSON 文档:
Miykael_xxm's avatar
Miykael_xxm 已提交
56 57 58 59 60 61 62 63 64 65 66

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

茶陵後's avatar
茶陵後 已提交
67
通过浏览器或 curl 获取响应很容易,但这种方式并不是用途很广。
Miykael_xxm's avatar
Miykael_xxm 已提交
68

茶陵後's avatar
茶陵後 已提交
69
以编程方式使用 REST Web 服务是更通用的方法。为了帮助您完成这项任务,Spring 提供了一个方便的模板类,称为[`RestTemplate`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html). `RestTemplate` 大大简化了与 RESTful 服务交互的代码。它甚至可以将该数据绑定到自定义的领域类。
Miykael_xxm's avatar
Miykael_xxm 已提交
70

茶陵後's avatar
茶陵後 已提交
71
首先,您需要创建一个领域类来包含您需要的数据。以下清单显示了可以用作领域类的`Quote`类:
Miykael_xxm's avatar
Miykael_xxm 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

```
src/main/java/com/example/consumingrest/Quote.java
```

```
package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@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 +
        '}';
  }
}
```

茶陵後's avatar
茶陵後 已提交
117
这个简单的 Java 类有一些属性和对应的 getter 方法。用于 JSON 处理的 Jackson  库的 `@JsonIgnoreProperties` 注释意味着未绑定在此类中的属性都应被忽略。
Miykael_xxm's avatar
Miykael_xxm 已提交
118

茶陵後's avatar
茶陵後 已提交
119
要将数据直接绑定到自定义领域类,您需要在类中定义和 API 返回的 JSON 中的键完全相同的变量名称。如果您的 JSON 中的变量名称和键不匹配,您可以使用`@JsonProperty`注释来为变量指定对应的 JSON 的键。(此示例中每个变量名称都与 JSON 键匹配,因此此处不需要该注释。)
Miykael_xxm's avatar
Miykael_xxm 已提交
120

茶陵後's avatar
茶陵後 已提交
121
您还需要一个额外的类来存储引文。`Value`类满足了这一需求,展示如下 (`src/main/java/com/example/consumingrest/Value.java`) :
Miykael_xxm's avatar
Miykael_xxm 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

```
package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Value {

  private Long id;
  private String quote;

  public Value() {
  }

  public Long getId() {
    return this.id;
  }

  public String getQuote() {
    return this.quote;
  }

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

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

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

茶陵後's avatar
茶陵後 已提交
163
这个类使用了相同的注释,但数据会根据变量名映射到不同的字段。
Miykael_xxm's avatar
Miykael_xxm 已提交
164

茶陵後's avatar
茶陵後 已提交
165
## 完成应用
Miykael_xxm's avatar
Miykael_xxm 已提交
166

茶陵後's avatar
茶陵後 已提交
167
Initalizr 创建了一个带有`main()`方法的类。以下代码显示了 Initializr 创建的类(`src/main/java/com/example/consumingrest/ConsumingRestApplication.java`):
Miykael_xxm's avatar
Miykael_xxm 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

```
package com.example.consumingrest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumingRestApplication {

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

}
```

茶陵後's avatar
茶陵後 已提交
185
现在您需要向`ConsumingRestApplication`类添加一些代码,以使其展示 RESTful 源服务返回的引文。您需要添加:
Miykael_xxm's avatar
Miykael_xxm 已提交
186

茶陵後's avatar
茶陵後 已提交
187 188 189
- 一个日志记录器,用于将输出发送到日志(在此示例中为控制台)。
- 一个 `RestTemplate`,它使用用于 JSON 处理的 Jackson 库来处理传入的数据。
- 一个在启动时用来运行 `RestTemplate``CommandLineRunner`(获取我们的引文)。
Miykael_xxm's avatar
Miykael_xxm 已提交
190

茶陵後's avatar
茶陵後 已提交
191
以下代码是最终的`ConsumingRestApplication`类 ( `src/main/java/com/example/consumingrest/ConsumingRestApplication.java`):
Miykael_xxm's avatar
Miykael_xxm 已提交
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

```
package com.example.consumingrest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.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) throws Exception {
		return args -> {
			Quote quote = restTemplate.getForObject(
					"https://quoters.apps.pcfone.io/api/random", Quote.class);
			log.info(quote.toString());
		};
	}
}
```

## 运行应用程序

茶陵後's avatar
茶陵後 已提交
232
您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必要依赖项、类和资源的单个可执行 JAR 文件并运行它。构建一个可执行的 jar 可以在整个开发生命周期、不同环境中作为应用程序轻松地去交付、升级、部署。
Miykael_xxm's avatar
Miykael_xxm 已提交
233

茶陵後's avatar
茶陵後 已提交
234
如果您使用 Gradle,则可以使用`./gradlew bootRun` 去运行程序。或者,您可以使用`./gradlew build`构建 JAR 文件,然后运行 JAR 文件,如下所示:
Miykael_xxm's avatar
Miykael_xxm 已提交
235 236 237 238 239

```
java -jar build/libs/gs-consuming-rest-0.1.0.jar
```

茶陵後's avatar
茶陵後 已提交
240
如果您使用 Maven,则可以使用`./mvnw spring-boot:run`. 或者,您可以使用`./mvnw clean package`构建 JAR 文件,然后运行该 JAR 文件,如下所示:
Miykael_xxm's avatar
Miykael_xxm 已提交
241 242 243 244 245

```
java -jar target/gs-consuming-rest-0.1.0.jar
```

茶陵後's avatar
茶陵後 已提交
246
以上描述的步骤是如何创建一个可运行的 JAR。您还可以[构建经典的 WAR 文件](https://spring.io/guides/gs/convert-jar-to-war/)
Miykael_xxm's avatar
Miykael_xxm 已提交
247

茶陵後's avatar
茶陵後 已提交
248
您应该会看到类似于下面内容的输出,但会包含随机的引文:
Miykael_xxm's avatar
Miykael_xxm 已提交
249 250 251 252 253

```
2019-08-22 14:06:46.506  INFO 42940 --- [           main] c.e.c.ConsumingRestApplication           : Quote{type='success', value=Value{id=1, quote='Working with Spring Boot is like pair-programming with the Spring developers.'}}
```

茶陵後's avatar
茶陵後 已提交
254
如果您看到显示为的错误,`Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.consumingrest.Quote]` 则可能是您处于无法访问到后端服务的环境中(如果您可以访问它,它将发送 JSON)。如果您是公司代理的管理员,尝试将 `http.proxyHost``http.proxyPort` 系统属性设置为适合您的环境的值。
Miykael_xxm's avatar
Miykael_xxm 已提交
255 256 257 258 259 260 261

## 概括

恭喜!您刚刚使用 Spring Boot 开发了一个简单的 REST 客户端。

原文链接: https://spring.io/guides/gs/consuming-rest/

GitCode官方's avatar
GitCode官方 已提交
262