本指南将引导您完成创建使用 RESTful Web 服务的应用程序的过程。
您将构建什么
您将构建一个应用程序,该应用程序使用 Spring 的来检索随机的 Spring 启动报价RestTemplatehttp://localhost:8080/api/random.
你需要什么
- 约15分钟
- 最喜欢的文本编辑器或 IDE
- JDK 1.8或以后
- 格拉德尔 4+或梅文 3.2+
- 您也可以将代码直接导入到 IDE 中:
- 弹簧工具套件 (STS)
- 智能理念
- VSCode
如何完成本指南
像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。
要从头开始,请继续从 Spring 初始化开始.
要跳过基础知识,请执行以下操作:
- 下载并解压缩本指南的源存储库,或使用吉特:git clone https://github.com/spring-guides/gs-consuming-rest.git
- 光盘成gs-consuming-rest/initial
- 跳转到获取 REST 资源.
完成后,您可以根据 中的代码检查结果。gs-consuming-rest/complete
从 Spring 初始化开始
你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。
手动初始化项目:
如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。
您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。
获取 REST 资源
项目设置完成后,您可以创建一个使用 RESTful 服务的简单应用程序。
在执行此操作之前,您需要一个 REST 资源源。我们提供了此类服务的示例https://github.com/spring-guides/quoters.您可以在单独的终端中运行该应用程序,并在http://localhost:8080/api/random.该地址随机获取有关Spring Boot的报价,并将其作为JSON文档返回。其他有效地址包括http://localhost:8080/api/(对于所有报价)和http://localhost:8080/api/1(第一次报价),http://localhost:8080/api/2(对于第二个报价),依此类推(目前最多 10 个)。
如果您通过 Web 浏览器或 curl 请求该 URL,则会收到如下所示的 JSON 文档:
{ type: "success", value: { id: 10, quote: "Really loving Spring Boot, makes stand alone Spring apps easy." }}这很容易,但在通过浏览器或 curl 获取时并不是很有用。
使用 REST Web 服务的更有用方法是以编程方式使用。为了帮助你完成这项任务,Spring 提供了一个方便的模板类,称为RestTemplate. 使与大多数 RESTful 服务的交互成为单行咒语。它甚至可以将数据绑定到自定义域类型。RestTemplate
首先,您需要创建一个域类来包含所需的数据。以下清单显示了可用作域类的类:Quote
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 + '}'; }}这个简单的Java类有一些属性和匹配的getter方法。它使用杰克逊 JSON 处理库中的注释,以指示应忽略此类型中未绑定的任何属性。@JsonIgnoreProperties
若要将数据直接绑定到自定义类型,需要指定变量名称与从 API 返回的 JSON 文档中的键完全相同。如果 JSON 文档中的变量名称和键不匹配,您可以使用注释来指定 JSON 文档的确切键。(此示例将每个变量名称与 JSON 键匹配,因此此处不需要该注释。@JsonProperty
您还需要一个额外的类来嵌入内部引号本身。该类满足了该需求,并显示在以下列表中(在):Valuesrc/main/java/com/example/consumingrest/Value.java
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 + '\'' + '}'; }}这使用相同的注释,但映射到其他数据字段。
完成申请
Initalizr 使用方法创建一个类。下面的清单显示了初始化者创建的类(在):main()src/main/java/com/example/consumingrest/ConsumingRestApplication.java
package com.example.consumingrest;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ConsumingRestApplication { public static void main(String[] args) { SpringApplication.run(ConsumingRestApplication.class, args); }}现在你需要在类中添加一些其他的东西,让它显示来自我们的 RESTful 源的引文。您需要添加:ConsumingRestApplication
- 记录器,用于将输出发送到日志(在本例中为控制台)。
- A ,它使用杰克逊 JSON 处理库来处理传入的数据。RestTemplate
- 在启动时运行(并因此获取我们的报价)。CommandLineRunnerRestTemplate
以下清单显示了已完成的类(位于):ConsumingRestApplicationsrc/main/java/com/example/consumingrest/ConsumingRestApplication.java
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;@SpringBootApplicationpublic 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( "http://localhost:8080/api/random", Quote.class); log.info(quote.toString()); }; }}运行应用程序
您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。
如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./gradlew bootRun./gradlew build
java -jar build/libs/gs-consuming-rest-0.1.0.jar如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./mvnw spring-boot:run./mvnw clean package
java -jar target/gs-consuming-rest-0.1.0.jar此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件.
您应该看到类似于以下内容的输出,但带有随机引号:
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.'}}如果您看到错误为 ,则可能是您所处的环境无法连接到后端服务(如果可以访问后端服务,则发送 JSON)。也许你在公司代理后面。尝试将 和 系统属性设置为适合您的环境的值。Could not extract response: no suitable HttpMessageConverter found for response type [class com.example.consumingrest.Quote]http.proxyHosthttp.proxyPort
总结
祝贺!您刚刚使用 Spring Boot 开发了一个简单的 REST 客户端。