您将构建什么
您将构建一个应用程序,该应用程序使用 Spring 在 http://localhost:8080/api/random 端口上 Spring 启动。
获取 REST 资源
在执行此操作之前,您需要一个 REST 资源源。我们在 GitHub - spring-guides/quoters: Spring Boot quotation service to support REST-based guides 提供了此类服务的示例。您可以在单独的终端中运行该应用程序,并在 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 record Quote(String type, Value value) { }
这个简单的 Java 记录类使用杰克逊 JSON 处理库中的注释,以指示应忽略此类型中未绑定的任何属性。@JsonIgnoreProperties
若要将数据直接绑定到自定义类型,需要指定变量名称与从 API 返回的 JSON 文档中的键完全相同。如果 JSON 文档中的变量名称和键不匹配,您可以使用注释来指定 JSON 文档的确切键。(此示例将每个变量名称与 JSON 键匹配,因此此处不需要该注释。@JsonProperty
您还需要一个额外的类来嵌入内部引号本身。记录类满足了该需求,并显示在以下清单中(位于):Value
src/main/java/com/example/consumingrest/Value.java
package com.example.consumingrest;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public record Value(Long id, String 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;
@SpringBootApplication
public class ConsumingRestApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumingRestApplication.class, args);
}
}
现在你需要在类中添加一些其他的东西,让它显示来自我们的 RESTful 源的引文。您需要添加:ConsumingRestApplication
-
记录器,用于将输出发送到日志(在本例中为控制台)。
-
A ,它使用杰克逊 JSON 处理库来处理传入的数据。
RestTemplate
-
在启动时运行(并因此获取我们的报价)。
CommandLineRunner
RestTemplate
以下清单显示了已完成的类(位于):ConsumingRestApplication
src/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;
@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(
"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.proxyHost http.proxyPort |
总结
祝贺!您刚刚使用 Spring Boot 开发了一个简单的 REST 客户端。