🍊
翻译橙
🍊返回主站🤖参与贡献
  • hello,这里是翻译橙
  • spring boot参考文档
    • 1. 法律
    • 2. 寻求帮助
    • 3. 文档概述
    • 4. 入门
    • 5. 升级Spring Boot
    • 6. 使用 Spring Boot 进行开发
      • 6.1. 构建系统
      • 6.2. 构建你的代码
      • 6.3. 配置类
      • 6.4. 自动配置
      • 6.5. Spring Bean 和依赖注入
      • 6.6. 使用@SpringBootApplication注解
      • 6.7. 运行您的应用程序
      • 6.8. 开发者工具
      • 6.9. 打包您的生产应用程序
      • 6.10. 接下来读什么
    • 7.核心特性
      • 7.1. SpringApplication
      • 7.2. 外部化配置
      • 7.3.Profile配置
      • 7.4.日志记录
      • 7.5.国际化
      • 7.6 面向切面的编程
      • 7.7. JSON
      • 7.8. 任务执行与调度
      • 7.9. 单元测试
        • 7.9.1. 测试范围依赖
        • 7.9.2. 测试 Spring 应用程序
        • 7.9.3. 测试 Spring Boot 应用程序
        • 7.9.4. 测试容器
        • 7.9.5. 测试工具
      • 7.10. Docker Compose 支持
      • 7.11. 测试容器支持
      • 7.12. 创建您自己的自动配置
      • 7.13. Kotlin 支持
      • 7.14 SSL
      • 7.15.接下来要读什么
    • 8. 网络
      • 8.1. Servlet Web 应用程序
        • 8.1.1. “Spring Web MVC 框架”
        • 8.1.2. JAX-RS 和Jersey
        • 8.1.3. 嵌入式 Servlet 容器支持
      • 8.2 反应式网络应用程序
        • 8.2.1. “Spring WebFlux 框架”
        • 8.2.2. 嵌入式反应式服务器支持
        • 8.2.3. 反应式服务器资源配置
      • 8.3. 优雅关机
      • 8.4. spring安全
        • 8.4.1. MVC安全
        • 8.4.2. WebFlux 安全
        • 8.4.3. OAuth2
        • 8.4.4. SAML 2.0
      • 8.5. spring 会话
      • 8.6.GraphQL
      • 8.7. Spring HATEOAS
      • 8.8.接下来读什么
    • 9. 数据
      • 9.1. SQL数据库
      • 9.2. 使用 NoSQL 技术
      • 9.3. 接下来读什么
    • 10. 消息
      • 10.1. JMS
      • 10.2. AMQP
      • 10.3. Apache Kafka 支持
      • 10.4. Apache Pulsar 支持
      • 10.5. RSocket
      • 10.6. Spring Integration
      • 10.7. WebSockets
      • 10.8. What to Read Next
    • 11. IO
      • 11.1. 缓存
      • 11.2. Hazelcast
      • 11.3. Quartz 调度程序
      • 11.4. 发送电子邮件
      • 11.5. 验证
      • 11.6. 调用 REST 服务
      • 11.7. web services
      • 11.8. 使用 JTA 进行分布式事务
      • 11.9. 接下来读什么
    • 12. 容器镜像
  • Spring核心功能
    • 1.IOC容器和Bean简介
      • 1.2. 容器概述
      • 1.3. Bean概述
      • 1.4. 依赖项
        • 1.4.1. 依赖注入
        • 1.4.2. 详细的依赖关系和配置
        • 1.4.3. 使用depends-on
        • 1.4.4. 延迟初始化的 Bean
        • 1.4.5. 自动装配协作者
        • 1.4.6. 方法注入
    • 2. Resources
      • 2.1. 介绍
      • 2.2. Resource接口
      • 2.3. 内置Resource实现
      • 2.4. ResourceLoader接口
      • 2.5. ResourcePatternResolver接口
      • 2.6. ResourceLoaderAware接口
      • 2.7. 资源作为依赖
      • 2.8. 应用程序上下文和资源路径
    • 3. 验证、数据绑定和类型转换
      • 3.1. 使用 Spring 的 Validator 接口进行验证
      • 3.2. 将代码解析为错误消息
      • 3.3. Bean 操作和BeanWrapper
      • 3.4. spring类型转换
      • 3.5. spring字段格式
      • 3.6. 配置全局日期和时间格式
      • 3.7. Java Bean 验证
    • 4. SpEL表达式
    • 5. Spring 面向切面编程
      • 5.1. AOP 概念
      • 5.2. Spring AOP 的能力和目标
      • 5.3. AOP 代理
      • 5.4. @AspectJ 支持
        • 5.4.1. 启用@AspectJ 支持
        • 5.4.2. 声明一个切面
        • 5.4.3. 声明切入点
        • 5.4.4. 声明切点
        • 5.4.5. 切面说明
        • 5.4.6. 切面实例化模型
        • 5.4.7. AOP 示例
      • 5.5. 基于模式的 AOP 支持
      • 5.6. 选择要使用的 AOP 声明样式
      • 5.7. 混合切面类型
      • 5.8. 代理机制
      • 5.9. @AspectJ 代理的程序化创建
      • 5.10. 在 Spring 应用程序中使用 AspectJ
      • 5.11.更多资源
    • 6. Spring AOP API
      • 6.1. Spring中的切入点API
      • 6.2. Spring 中的 Advice API
      • 6.3. Spring 中的 Advisor API
      • 6.4. 使用ProxyFactoryBean创建 AOP 代理
      • 6.5. 简洁的代理定义
      • 6.6. 以编程方式创建 AOP 代理ProxyFactory
      • 6.7. 操作切面对象
      • 6.8. 使用“自动代理”工具
      • 6.9. 使用TargetSource实现
      • 6.10. 定义新的切面类型
    • 7. 空指针安全
    • 8. 数据缓冲器和编解码器
    • 9. 日志
    • 10. 附录
      • 10.1. XML 模式
      • 10.2. 自定义XML Schema
        • 10.2.1. 创作 Schema
        • 10.2.2. 编码一个NamespaceHandler
        • 10.2.3. 使用BeanDefinitionParser
        • 10.2.4. 注册处理程序和模式
        • 10.2.5. 在 Spring XML 配置中使用自定义扩展
        • 10.2.6. 更详细的例子
      • 10.3. 应用程序启动步骤
  • 使用redis实现分布式锁
  • Java 安全标准算法名称
  • JDK 9 JEP
  • JDK 10 JEP
  • 人件
    • 《人件》
    • 第一部分 管理人力资源
      • 01 此时此刻,一个项目正在走向失败
      • 02 干酪汉堡,做一个,卖一个
      • 03 维也纳在等你
      • 04 质量——如果时间允许
      • 05 再谈帕金森定律
      • 06 苦杏素
    • 第二部分 办公环境
      • 07 家具警察
      • 08 “朝九晚五在这里啥也完成不了。”
      • 09 在空间上省钱
      • 间奏曲:生产效率度量和不明飞行物
      • 10 大脑时问与身体时间
      • 11 电话
      • 12 门的回归
      • 13 采取保护步骤
    • 第三部分 正确的人
      • 14 霍恩布洛尔因素
      • 15 谈谈领导力
      • 16 雇一名杂耍演员
      • 17 与他人良好合作
      • 18 童年的终结
      • 19 在这儿很开心
      • 20 人力资本
    • 第四部分 高效团队养成
      • 21 整体大于部分之和
      • 22 黑衣团队
      • 23 团队自毁
      • 24 再谈团队自毁
      • 25 竞争
      • 26 一顿意面晚餐
      • 27 敞开和服
      • 28 团队形成的化学反应
    • 第五部分 沃土
      • 29 自我愈复系统
      • 30 与风险共舞
      • 3l 会议、独白和交流
      • 32 终极管理罪恶得主是……
      • 33 “邪恶”电邮
      • 34 让改变成为可能
      • 35 组织型学习
      • 36 构建社区
    • 第六部分 快乐地工作
      • 37 混乱与秩序
      • 38 自由电子
      • 39 霍尔加·丹斯克
由 GitBook 提供支持
在本页

这有帮助吗?

在GitHub上编辑
  1. spring boot参考文档
  2. 11. IO

11.6. 调用 REST 服务

上一页11.5. 验证下一页11.7. web services

最后更新于1年前

这有帮助吗?

Spring Boot 提供了各种便捷的方式来调用远程 REST 服务。如果您正在开发非阻塞反应式应用程序并且正在使用 Spring WebFlux,那么您可以使用WebClient. 如果您更喜欢阻止 API,那么您可以使用RestClient或RestTemplate。

11.6.1. WebClient

如果您的类路径上有 Spring WebFlux,我们建议您使用WebClient来调用远程 REST 服务。WebClient界面提供了函数式 API,并且是完全响应式的。WebClient专门部分了解更多相关信息。

如果您不编写响应式 Spring WebFlux 应用程序,则可以使用替代WebClient. 这提供了类似的功能 API,但是阻塞式的而不是响应式的。

Spring Boot为您创建并预配置原型WebClient.Builderbean。强烈建议将其注入您的组件中并使用它来创建WebClient实例。Spring Boot 正在配置该构建器以共享 HTTP 资源并以与服务器相同的方式反映编解码器设置(请参阅)等等。

下面的代码展示了一个典型的例子:

@Service
public class MyService {
​
    private final WebClient webClient;
​
    public MyService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("https://example.org").build();
    }
​
    public Mono<Details> someRestCall(String name) {
        return this.webClient.get().uri("/{name}/details", name).retrieve().bodyToMono(Details.class);
    }
​
}

WebClient运行时

Spring Boot 将根据应用程序类路径上可用的库自动检测使用哪个 ClientHttpConnector 来驱动WebClient。按照优先顺序,支持以下客户端:

  1. Reactor Netty

  2. Jetty RS 客户端

  3. Apache HttpClient

  4. JDK HttpClient

如果类路径上有多个客户端可用,则将使用最首选的客户端。

默认情况下,启动器spring-boot-starter-webflux依赖于io.projectreactor.netty:reactor-netty服务器和客户端实现。如果您选择使用 Jetty 作为反应式服务器,则应添加对 Jetty Reactive HTTP 客户端库 的依赖项org.eclipse.jetty:jetty-reactive-httpclient。服务器和客户端使用相同的技术有其优点,因为它将自动在客户端和服务器之间共享 HTTP 资源。

开发人员可以通过提供自定义ReactorResourceFactory或JettyResourceFactorybean来覆盖 Jetty 和 Reactor Netty 的资源配置- 这将应用于客户端和服务器。

如果您希望覆盖客户端的选择,您可以定义自己的ClientHttpConnectorbean 并完全控制客户端配置。

WebClient定制

自定义有三种主要方法WebClient,具体取决于您希望自定义应用的范围。

为了使任何自定义的范围尽可能缩小,请注入自动配置的WebClient.Builder内容,然后根据需要调用其方法。 WebClient.Builder实例是有状态的:构建器上的任何更改都会反映在随后使用它创建的所有客户端中。如果您想使用同一个构建器创建多个客户端,您还可以考虑使用WebClient.Builder other = builder.clone();.

要对所有WebClient.Builder实例进行应用程序范围的附加自定义,您可以声明WebClientCustomizerbean 并在注入点位置更改WebClient.Builder。

最后,您可以回退到原始 API 并使用WebClient.create(). 在这种情况下,不会应用任何WebClientCustomizer的自动配置。

WebClient SSL 支持

如果您需要在ClientHttpConnector所使用的WebClient上进行自定义 SSL 配置,您可以注入一个WebClientSsl可与构建器apply方法一起使用的实例。

下面的代码展示了一个典型的例子:

@Service
public class MyService {
​
    private final WebClient webClient;
​
    public MyService(WebClient.Builder webClientBuilder, WebClientSsl ssl) {
        this.webClient = webClientBuilder.baseUrl("https://example.org").apply(ssl.fromBundle("mybundle")).build();
    }
​
    public Mono<Details> someRestCall(String name) {
        return this.webClient.get().uri("/{name}/details", name).retrieve().bodyToMono(Details.class);
    }
​
}

11.6.2. Rest 客户端

如果您在应用程序中没有使用 Spring WebFlux 或 Project Reactor,我们建议您使用RestClient调用远程 REST 服务。

RestClient接口提供了函数式阻塞API。

Spring Boot为您创建并预配置原型RestClient.Builderbean。强烈建议将其注入您的组件中并使用它来创建RestClient实例。Spring Boot 正在使用HttpMessageConverters 和适当的 ClientHttpRequestFactory 配置该构建器。

下面的代码展示了一个典型的例子:

@Service
public class MyService {
​
    private final RestClient restClient;
​
    public MyService(RestClient.Builder restClientBuilder) {
        this.restClient = restClientBuilder.baseUrl("https://example.org").build();
    }
​
    public Details someRestCall(String name) {
        return this.restClient.get().uri("/{name}/details", name).retrieve().body(Details.class);
    }
​
}

RestClient定制

自定义有三种主要方法RestClient,具体取决于您希望自定义应用的范围。

为了使任何自定义的范围尽可能缩小,请注入自动配置的RestClient.Builder内容,然后根据需要调用其方法。

RestClient.Builder实例是有状态的:构建器上的任何更改都会反映在随后使用它创建的所有客户端中。如果您想使用同一个构建器创建多个客户端,您还可以考虑使用RestClient.Builder other = builder.clone();.

要对所有RestClient.Builder实例进行应用程序范围的附加自定义,您可以声明RestClientCustomizerbean 并在注入点位置更改RestClient.Builder。

最后,您可以回退到原始 API 并使用RestClient.create(). 在这种情况下,不会应用任何RestClientCustomizer的自动配置。

RestClient SSL 支持

如果您需要在ClientHttpRequestFactory所使用的RestClient上进行自定义 SSL 配置,您可以注入一个RestClientSsl可与构建器apply方法一起使用的实例。

下面的代码展示了一个典型的例子:

@Service
public class MyService {
​
    private final RestClient restClient;
​
    public MyService(RestClient.Builder restClientBuilder, RestClientSsl ssl) {
        this.restClient = restClientBuilder.baseUrl("https://example.org").apply(ssl.fromBundle("mybundle")).build();
    }
​
    public Details someRestCall(String name) {
        return this.restClient.get().uri("/{name}/details", name).retrieve().body(Details.class);
    }
​
}

如果除了 SSL 捆绑包之外您还需要应用其他自定义,则可以将ClientHttpRequestFactorySettings类与ClientHttpRequestFactories一起使用:

@Service
public class MyService {
​
    private final RestClient restClient;
​
    public MyService(RestClient.Builder restClientBuilder, SslBundles sslBundles) {
        ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.DEFAULTS
            .withReadTimeout(Duration.ofMinutes(2))
            .withSslBundle(sslBundles.getBundle("mybundle"));
        ClientHttpRequestFactory requestFactory = ClientHttpRequestFactories.get(settings);
        this.restClient = restClientBuilder.baseUrl("https://example.org").requestFactory(requestFactory).build();
    }
​
    public Details someRestCall(String name) {
        return this.restClient.get().uri("/{name}/details", name).retrieve().body(Details.class);
    }
​
}

11.6.3. RestTemplate

由于RestTemplate实例在使用之前通常需要进行自定义,因此 Spring Boot 不提供任何单个自动配置的RestTemplatebean。但是,它会自动配置 RestTemplateBuilder,可用于在需要时创建RestTemplate实例。自动配置RestTemplateBuilder可确保将合理HttpMessageConverters和适当的ClientHttpRequestFactory应用到RestTemplate实例。

下面的代码展示了一个典型的例子:

@Service
public class MyService {
​
    private final RestTemplate restTemplate;
​
    public MyService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }
​
    public Details someRestCall(String name) {
        return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    }
​
}

RestTemplateBuilder包括许多有用的方法,可用于快速配置RestTemplate. 例如,要添加 BASIC 身份验证支持,您可以使用builder.basicAuthentication("user", "password").build().

RestTemplate定制

自定义有三种主要方法RestTemplate,具体取决于您希望自定义应用的范围。

为了使任何自定义的范围尽可能缩小,请注入自动配置的内容RestTemplateBuilder,然后根据需要调用其方法。每个方法调用都会返回一个新RestTemplateBuilder实例,因此自定义仅影响构建器的这种使用。

要进行应用程序范围的附加定制,请使用RestTemplateCustomizerbean。所有此类 bean 都会自动注册到自动配置RestTemplateBuilder,并应用于使用它构建的任何模板。

以下示例显示了一个定制程序,该定制程序为除以下主机192.168.0.5之外的所有主机配置代理的使用:

public class MyRestTemplateCustomizer implements RestTemplateCustomizer {
​
    @Override
    public void customize(RestTemplate restTemplate) {
        HttpRoutePlanner routePlanner = new CustomRoutePlanner(new HttpHost("proxy.example.com"));
        HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }
​
    static class CustomRoutePlanner extends DefaultProxyRoutePlanner {
​
        CustomRoutePlanner(HttpHost proxy) {
            super(proxy);
        }
​
        @Override
        protected HttpHost determineProxy(HttpHost target, HttpContext context) throws HttpException {
            if (target.getHostName().equals("192.168.0.5")) {
                return null;
            }
            return super.determineProxy(target, context);
        }
​
    }
​
}

最后,您可以定义自己的RestTemplateBuilderbean。这样做将替换自动配置的构建器。如果您希望将任何RestTemplateCustomizerbean 应用于您的自定义构建器(就像自动配置一样),请使用RestTemplateBuilderConfigurer. 以下示例公开了与 Spring Boot 的自动配置将执行的操作相匹配的RestTemplateBuilder ,除此之外还指定了自定义连接和读取超时:

@Configuration(proxyBeanMethods = false)
public class MyRestTemplateBuilderConfiguration {
​
    @Bean
    public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
        return configurer.configure(new RestTemplateBuilder())
            .setConnectTimeout(Duration.ofSeconds(5))
            .setReadTimeout(Duration.ofSeconds(2));
    }
​
}

最极端(且很少使用)的选项是在不使用配置器的情况下创建您自己的RestTemplateBuilderbean。除了替换自动配置的构建器之外,这还可以防止使用任何RestTemplateCustomizer bean。

RestTemplate SSL 支持

@Service
public class MyService {
​
    private final RestTemplate restTemplate;
​
    public MyService(RestTemplateBuilder restTemplateBuilder, SslBundles sslBundles) {
        this.restTemplate = restTemplateBuilder.setSslBundle(sslBundles.getBundle("mybundle")).build();
    }
​
    public Details someRestCall(String name) {
        return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    }
​
}

11.6.4. RestClient 和 RestTemplate 的 HTTP 客户端检测

Spring Boot 将根据应用程序类路径上可用的库自动检测与 RestClient 和RestTemplate 一起使用的 HTTP 客户端。按照优先顺序,支持以下客户端:

  1. Apache HttpClient

  2. Jetty HttpClient

  3. OkHttp(已弃用)

  4. 简单的 JDK 客户端 ( HttpURLConnection)

如果类路径上有多个客户端可用,则将使用最首选的客户端。

了解有关配置选项的更多信息。

该界面提供对您在application.properties或application.yaml文件中定义的任何WebClientSsl访问。

该界面提供对您在application.properties或application.yaml文件中定义的任何RestClientSsl访问。

Spring Framework 的类早于RestClient并且是许多应用程序用来调用远程 REST 服务的经典方式。RestTemplate当您不想迁移到现有代码RestClient,或者因为您已经熟悉该API 时,您可能会选择使用RestTemplate。

如果您需要在 上进行自定义 SSL 配置RestTemplate,您可以将应用于 RestTemplateBuilder,如本示例所示:

您可以在 Spring 框架文档的
RestClient
WebFlux HTTP 编解码器自动配置
您可以在 Spring 框架WebClient参考文档中
SSL 捆绑包的
SSL 捆绑包的
RestTemplate
SSL 捆绑包